我将这个模式用于我的一些代码:
(function () {
var a,
b,
c,
d;
a = // some module definition
b = // some module definition
c = // some module definition
d = // some module definition
}());
我注意到,如果b
需要访问a
,则必须先定义b
。因此a
可以引用a
,但b
无法引用{{1}}。
我发现这很奇怪,因为我认为一个叫做吊装的过程让我不必按任何特定的顺序定义我的模块。
但我发现,排序确实很重要。
答案 0 :(得分:4)
仅提升var
声明。不是=
作业。
这意味着你可以引用一个变量,其var
声明在函数后面出现而没有得到 ReferenceError ,但它的值将是undefined
,直到赋值实际需要的地方。
(function() {
alert(b); // undefined
var b = "foo";
alert(b); // "foo"
})();
由于“提升”,上面的例子有效地转变为:
(function() {
var b;
alert(b); // undefined
b = "foo";
alert(b); // "foo"
})();
答案 1 :(得分:2)
吊装意味着声明发生得更早,但分配不会移动。该变量将被声明但未定义。
由于范围问题,吊装可能会造成混乱。例如:
var a = 1;
var somFunc = function(){
var b = a;
alert(b); // alert undefined
var a = 3
}
someFunc();
这种情况下的提醒是“未定义的”,因为第二个var a
在hoisted
之上var b
,但是分配一直持续到第一个a
赋值被覆盖,因为它超出了范围。