Javascript:这个变量放在哪个作用域中

Javascript: In which scope is this variable placed?

本文关键字:作用域 变量 Javascript      更新时间:2023-09-26

我有以下函数,它是根据这个StackOverflow问题创建的。

我的问题是关于返回函数的参数;CCD_ 1。

当我运行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);
    };
})();

我很感激我的措辞可能有点偏离。如果是这样,请改进我的措辞。

看起来像一个javascript闭包,其中delayResizeEvent(func(), 500, "Unique name")中的参数是从外部函数(delayResizedEvent)调用的,但内部函数(return function()是一个匿名函数)也可以访问它们。func()500"Unique Name"都在delayResizeEvent的范围内,但由于函数中的函数创建了闭包,内部函数可以访问外部函数的变量。

关于Javascript闭包的更多信息。请参阅示例#7,它的格式与您的代码类似。

当我运行时,这些变量添加到哪个范围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);

delayResizeEvent(func(), 500, "Unique name")正在使用闭包。参数值仅在函数作用域本地绑定到(callback, ms, uniqueId)0。

当我运行delayResizeEvent(func(), 500, "Unique name")时,这些变量被添加到哪个范围?

一个新的。当函数被调用时,一个新的变量上下文被实例化。它将引用匿名函数的作用域(包含timer变量)作为其父上下文(指向继续查找的位置)。作用域包含声明为形式参数的3个变量:callbackmsuniqueId

传递的值(即func()的结果、数字和字符串)将与它们绑定,并执行函数代码。函数完成后,作用域可以被垃圾回收,因为没有任何内容再引用它。