Javascript:功能提升

时间:2016-07-24 03:52:45

标签: javascript hoisting

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

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

所以我理解,当变量被提升时,bar仍然高于foo,但foo会被执行,所以解释器不应该知道foo是什么?

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

1 个答案:

答案 0 :(得分:5)

如果您考虑变量定义提升,您的代码就相当于:

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的方式,它只是一个像其他任何变量一样的变量。