繁体   English   中英

何时起吊?

[英]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 hoistedvar b之上,但是分配一直保留到之后,而第a变量被覆盖,因为它不在范围内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM