假设我有一个警告消息的简单函数:

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()时创建的匿名函数。此匿名函数还接收当前作用域的副本。

关于javascript - 为什么此关闭有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9519240/

10-12 16:45