使用Immediately-invoked函数表达式时,JavaScript Hoisting声明混淆

时间:2014-09-10 17:46:31

标签: javascript html web frontend hoisting

感到困惑。

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 

但事实上,它输出"我很酷",为什么是????

2 个答案:

答案 0 :(得分:4)

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

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

,则适用吊装
var call = (function() {
    message = "I am cool";
    var message;
})();

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

答案 1 :(得分:1)

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

您可以使用

来阻止这种情况
var message = "Xinrui Ma";

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

alert(message);