1

我将这种模式用于我的一些代码:

(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

我觉得这很奇怪,因为我认为一个称为提升的过程允许我不必以任何特定的顺序定义我的模块。

但我发现排序确实很重要。

4

2 回答 2

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"
})();
于 2013-04-25T23:25:50.747 回答
2

提升意味着声明发生得更早,但分配不会移动。该变量将被声明但未定义。

由于范围问题,提升可能会导致混淆。例如:

var a = 1;
var somFunc = function(){
  var b = a;
  alert(b); // alert undefined
  var a = 3
}
someFunc();

在这种情况下,警报是“未定义”,因为第二个var ahoisted之上var b,但是分配一直保留到之后,并且第一个a分配被覆盖,因为它超出了范围。

于 2013-04-25T23:29:11.413 回答