感到困惑。
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
但事实上,它输出"我很酷",为什么是????
答案 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);