Javascript:函数提升

Javascript: Function hoisting

在这个例子中,我知道它会打印 undefined

var bar = typeof foo;
var foo = function() {
  console.log('abcd');
}
foo();
console.log(bar); // -> undefined

所以我理解当变量被提升时,bar仍然在foo之上,但是foo被执行了,所以解释器不应该知道foo是?

注意:我正在尝试了解解释器的工作原理。我的问题不是关于如何修复上面的代码段。

如果你考虑变量定义提升,你的代码等同于:

var bar;
var foo;

// foo does not yet have a value, so it it's still undefined
bar = typeof foo;

// foo gets a value here
foo = function() {
  console.log('abcd');
}

// since foo got a value in the previous statement, you can now execute it here
foo();
console.log(bar);

只有变量定义本身被提升,而不是赋值。

因此,您可以从这个顺序中看到,当您执行 bar = typeof foo 时,foo 还没有值,因此您将 undefined 分配给 bar


函数定义如:

function foo() {
    console.log('abcd');
}

也是挂起的,所以如果你这样定义foo,那就另当别论了。但是您正在使用的功能分配本身并没有提升。您定义 foo 的方式与其他任何方式一样只是一个变量赋值。