功能和可变提升的意外结果

时间:2018-05-26 07:13:37

标签: javascript hoisting

我正在读这个系列的第二本书"你不认识JS"我在变量之前提升了read that个函数。

所以这就是代码:



foo(); // 1

var foo;

function foo() {
    console.log( 1 );
}

foo = function() {
    console.log( 2 );
};




这个输出将是1.但为什么呢?首先提升函数,然后提升变量。因此,在我的函数foo(打印1的那个)被提升之后,它必须跟随变量foo。所以结果应该是" undefined"而不是" 1"。

我希望代码的行为就像是:

// hoisted first
function foo() {
    console.log( 1 );
}

// hoisted second
var foo;  // implicitly initialized to 'undefined'

foo();  // call 'undefined' - error?

foo = function() {
    console.log( 2 );
};

这里发生了什么?

1 个答案:

答案 0 :(得分:9)

如上所述,函数在变量之前被提升;如果在范围内已经定义了 var foo之后,interpterer遇到foo ,则会被忽略。它不会将foo分配给undefined,它只会确保当前作用域中存在名为foo的变量 - 它已经存在。

正如你在“不知道JS”链接中所说:

  

多次/重复的var声明被有效忽略

这是另一个常见的被忽略的重复变量示例,可能更熟悉/更直观:

if (false)
  var foo = false;
else
  var foo = true;

变成

var foo;
var foo; // does not actually do anything; does not assign `undefined` to `foo`, ignored
// foo just *happens* to not have anything assigned to it in almost all cases like this
if (false)
  foo = false;
else
  foo = true;