Javascript:这个变量放在哪个作用域中
Javascript: In which scope is this variable placed?
我有以下函数,它是根据这个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个变量:callback
、ms
和uniqueId
。
传递的值(即func()
的结果、数字和字符串)将与它们绑定,并执行函数代码。函数完成后,作用域可以被垃圾回收,因为没有任何内容再引用它。
- 当我更新另一个作用域变量时,作用域变量会自动更新
- 如何在隔离作用域指令中访问此作用域变量
- 正在向构造函数添加作用域变量
- 如何在angularjs中将多个作用域变量传递到自定义指令中
- 作用域变量未从状态父控制器继承到子控制器
- 插槽:访问作用域变量
- 在另一个作用域变量中使用AngularJS作用域变量
- 在Angular.js中通过检查作用域变量进行过滤
- 如何更新作为属性传入的作用域变量
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- 从$http.get调用更新Angular作用域变量
- AngularJS ui路由器:访问子作用域变量
- 访问AngularJS中函数中的作用域变量
- 为什么Angular 1.5双向绑定在将作用域变量传递给组件绑定时失败
- 修改作用域变量后,未更新作用域绑定
- 控制器作用域变量在刷新之前未加载
- 将Angular作用域变量的字符串描述传递给指令
- 将内部作用域变量绑定到外部“模板”
- 无法在 $.post 回调中设置作用域变量
- 如何从在 JS 中用作参数的匿名函数中分配外部作用域变量