我有以下从this StackOverflow question创建的函数。
我的问题是关于返回函数的参数; (callback, ms, uniqueId)
。
当我运行delayResizeEvent(func(), 500, "Unique name")
时,这些变量会添加到哪个范围?
var delayResizeEvent = (function () {
'use strict';
var timers = {};
return function (callback, ms, uniqueId) {
if (!uniqueId) {
uniqueId = "Don't call this twice without a uniqueId";
}
if (timers[uniqueId]) {
clearTimeout(timers[uniqueId]);
}
timers[uniqueId] = setTimeout(callback, ms);
};
})();
我很欣赏我的措辞可能有些偏差。如果是这样,请改善我的想法。
答案 0 :(得分:1)
看起来像一个javascript闭包,其中delayResizeEvent(func(), 500, "Unique name")
中的参数是从外部函数(delayResizedEvent)调用的,但是内部函数(return function()
是一个匿名函数)也可以访问它们。 func()
,500
和"Unique Name"
属于delayResizeEvent的范围,但由于从函数内的函数创建的闭包,内部函数可以访问外部函数的变量。
有关Javascript Closures的更多信息。请参阅示例#7,其格式与您的代码类似。
答案 1 :(得分:1)
在我运行时添加到这些变量的范围 delayResizeEvent(func(),500,“唯一名称”)?
前两个参数用作setTimeout的参数,最后一个参数用于在名为timers的对象上添加或查找键值,此对象可用,因为delayResizeEvent是函数的返回值(闭包)。闭包是从包含函数/函数的函数返回值时。每个返回的函数都有一个特殊的环境,因此您可以访问在函数体中声明的返回它/它们的变量。
传递的变量和timers
变量的范围仅在函数体内。
您可以在此处找到有关闭包的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures
如果您想继续使用唯一ID调用此函数,那么我建议清理计时器,因为它可能会泄漏内存:
if (timers[uniqueId]) {
clearTimeout(timers[uniqueId]);
delete timers[uniqueId];
}
timers[uniqueId] = setTimeout(function(){
delete timers[uniqueId];
callback();
}, ms);
答案 2 :(得分:1)
delayResizeEvent(func(), 500, "Unique name")
正在使用闭包。参数值仅在函数范围内局部绑定到function (callback, ms, uniqueId)
。
答案 3 :(得分:1)
当我运行
delayResizeEvent(func(), 500, "Unique name")
时,这些变量会添加到哪个范围?
一个新的。调用该函数时,将实例化一个新的变量上下文。它将引用匿名函数(包含timer
变量)的范围作为其父上下文(继续查找的位置)。范围包含3个变量,这些变量被声明为形式参数:callback
,ms
和uniqueId
。
传递的值(即func()
的结果,数字和字符串)将绑定到它们,并执行功能代码。函数完成后,范围可以被垃圾收集,因为没有任何引用它。