我正在阅读这本书' Scope&瓶盖'在系列中你不知道JS'我读到函数先挂起,变量稍后挂起。 浏览此代码段:
function foo() {
var a = 2;
function bar() {
console.log( a ); // 2
}
bar();
}
foo();
如果是这种情况,函数bar()是否应该挂到顶部并且此代码应该产生错误?因为在吊装之后,这段代码应该是这样的(至少我理解的)
function foo() {
function bar() {
console.log( a );
}
var a;
a = 2;
}
这是因为函数被提升到顶部和后面的变量。如果不是这样,请纠正我。
答案 0 :(得分:2)
他们都将一直提升到顶部,因此a
位于bar
的范围内;它的功能不是"以上"变量。订单发挥作用的唯一时间是函数声明和变量具有相同的名称,在这种情况下函数声明获胜,因为当变量被提升时,如果已经存在变量,则不会创建它。现有的具有给定名称的绑定。
"起重"是一个方便的简写术语,但它不是字面的。当foo
被称为时会发生什么(留下一些细节以专注于问题中的问题):
foo
bar
和a
)然后,该对象用于处理执行上下文中的绑定(例如,在引用a
时使用与绑定关联的值,在设置a
时设置,等等。)
答案 1 :(得分:0)
hoisting
在编译部分完成,bar
函数的编译在调用之前不会完成。那么为什么bar
应该显示错误。
如果您还想了解有关如何编译或执行javascript的详细信息。这是一段精彩视频https://www.youtube.com/watch?v=QyUFheng6J0