例如,我有点困惑JavaScript中的词法作用域是如何实现的
function outer(){
a = 5;
function inner(){
console.log(a);
var a = 10; //hoisting
}
inner();
}
outer();如果我们在第5行重新定义a,那么它将打印undefined。为什么会这样呢?为什么解释器不遍历并检查outer.VO,即使在inner.VO中可以找到a,但是在定义它之前它已经被使用了?
发布于 2013-07-09 05:09:45
在我的记忆中,提升会导致inner函数被解释为:
function inner(){
var a;
console.log(a);
a = 10;
}因此,当您将a赋值为10时,它将查找作用域,直到找到a的定义为止,该定义位于inner函数内的var语句中。它认为没有必要超出这个范围,所以它的行为就像outer函数中的a不存在一样。此外,在执行var a;时,a在缺省情况下设置为undefined。这就是为什么您会看到undefined作为输出。
我将详细解释一下Javascript解释器遇到函数时会执行以下操作(这称为执行上下文) A-创建阶段1-第一步它创建一个不可访问的对象,称为variable object,它看起来像是外部函数的对象
a: undefined
inner : pointer to function2-它定义了函数的作用域链和'this‘的值
B-代码执行阶段它逐行执行代码
如果它遇到对尚未声明的函数的调用,它将执行该函数
inner : pointer to function如果您在声明之前调用了inner(),这是可以的,但这不适用于匿名函数
因为它就像对待任何变量一样
fn();
var fn = function () {..}这不会起作用,因为它的变量对象将是这样的
fn: undefined https://stackoverflow.com/questions/17535996
复制相似问题