0

困惑了。

var message = "Xinrui Ma";

var call = (function(){
    message = "I am cool";
})();

alert(message);

从我的角度来看,代码将被这样处理:

var message = "Xinrui Ma";

var call = (function(){
    var message;         // it will add message declaration here
    message = "I am cool";
})();

alert(message);        // this should alert the "Xinrui Ma", not the "I am cool", 
                       // cause Hoisting is JavaScript's default behavior of moving all declarations 
                       // to the top of the current scope 

但其实它输出的是“我很酷”,这是为什么呢???

4

2 回答 2

4

如果函数内没有变量声明,它会使用包含范围内的变量。它不会创建一个新的局部变量——如果它这样做了,就没有任何方法可以引用闭包变量。

这与提升无关,只有在函数中声明变量时才会发生。如果您写道:

var call = (function() {
    message = "I am cool";
    var message;
})();

在这种情况下,var声明将被提升到函数的顶部。

于 2014-09-10T17:49:17.780 回答
1

var关键字用于创建本地范围,默认情况下它使用全局范围。因此,此处的消息指向全局范围,您正在 IIFE 中对其进行修改。

您可以防止使用

var message = "Xinrui Ma";

var call = (function(){
    var message = "I am cool";
})();

alert(message);
于 2017-03-11T18:13:23.150 回答