Javascript:这个变量放在哪个范围内?

时间:2013-07-04 14:32:42

标签: javascript scope

我有以下从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);
    };
})();

我很欣赏我的措辞可能有些偏差。如果是这样,请改善我的想法。

4 个答案:

答案 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个变量,这些变量被声明为形式参数:callbackmsuniqueId

传递的值(即func()的结果,数字和字符串)将绑定到它们,并执行功能代码。函数完成后,范围可以被垃圾收集,因为没有任何引用它。