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
的方式与其他任何方式一样只是一个变量赋值。
在这个例子中,我知道它会打印 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
的方式与其他任何方式一样只是一个变量赋值。