[英]When does hoisting apply?
我将这种模式用于一些代码:
(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
。
我发现这很奇怪,因为我认为一个称为提升的过程使我不必按任何特定顺序定义模块。
但是我发现排序确实很重要。
仅挂起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"
})();
吊装意味着声明会更早发生,但分配不会移动。 该变量将被声明,但未定义。
吊装可能会由于范围问题而引起混乱。 因此,例如:
var a = 1;
var somFunc = function(){
var b = a;
alert(b); // alert undefined
var a = 3
}
someFunc();
在这种情况下,警报是“未定义的”,因为第二个var a
hoisted
在var b
之上,但是分配一直保留到之后,而第a
变量被覆盖,因为它不在范围内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.