[英]Why does this closure work?
假设我有一个简单的函数来警告消息:
function callMessage(msg){
alert(msg);
}
现在,当我这样称呼它时,它不起作用。 引发错误“嘿未定义”
function sayHi(){
var hey = "hi there"
setTimeout("callMessage(hey)", 1000);
}
sayHi();
但是当我在一个匿名函数中调用它时它确实有效:
function sayHi(){
var hey = "hi there"
setTimeout(function(){callMessage(hey);}, 1000);
}
sayHi();
为什么“hey”变量只有在我将其放入匿名函数时才可见?
在第一个示例中,在计时器到期并且保留当前范围之后评估代码。 hey
,那一刻是不确定的。
第二个示例 - 使用setTimeout
的正确方法 - 使用在调用setTimeout()
时创建的匿名函数。 此匿名函数还接收当前范围的副本。
“callMessage(嘿)”是一个字符串,而不是一个闭包。 它在超时运行时进行评估,此时变量hey不在范围内。
这是正常的。
第二个例子创建了我们称之为fixture的东西,这是一个执行上下文。 保存变量变量以供内存中的匿名函数使用。
在你的第一个例子中,hey变量没有保存在fixture中(因为javascript不能知道你之后会使用变量)因此在评估字符串时无法检索
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.