Javascript:功能提升

Ala*_*anH 0 javascript hoisting

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

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

所以我明白,当变量被提升,bar保持在上面foo,但是foo被执行时,解释器不应该知道它是什么foo

注意:我试图理解解释器的工作原理.我的问题不是关于如何修复上面的代码片段.

jfr*_*d00 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);
Run Code Online (Sandbox Code Playgroud)

只提升变量定义本身,而不是分配.

因此,您可以从这个排序中看到,当您执行时bar = typeof foo,foo它还没有值,因此您可以分配undefinedbar.


函数定义如:

function foo() {
    console.log('abcd');
}
Run Code Online (Sandbox Code Playgroud)

也被悬挂,所以如果你这样定义foo,那将是一个不同的故事.但是您使用的功能分配本身并未悬挂.你定义的方式foo,它只是一个变量赋值,就像任何其他.