繁体   English   中英

为什么这种关闭工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM