【发布时间】:2013-07-08 21:06:45
【问题描述】:
例如,我对如何在 JavaScript 中完成词法作用域感到困惑
function outer(){
a = 5;
function inner(){
console.log(a);
var a = 10; //hoisting
}
inner();
}
outer();
如果我们在第 5 行重新定义a,那么它将打印undefined。这是为什么?为什么解释器不向上遍历检查outer.VO,即使a可以在inner.VO中找到,但它在定义之前就被使用了?
【问题讨论】:
-
vars 到顶部,所以你的代码真的是 function inner(){ var a;控制台.log(a); a=10; }
-
因为这正是提升的意思:它不会进一步遍历作用域链,因为标识符已经在
inner的作用域中找到,并解析到内部a变量,即使尚未初始化。
标签: javascript lexical-scope hoisting