我很担心JavaScript中的词法范围是如何完成的,例如
function outer(){
a = 5;
function inner(){
console.log(a);
var a = 10; //hoisting
}
inner();
}
outer();
如果我们在第5行重新定义a
,则会打印undefined
。这是为什么?为什么解释器不会遍历并检查outer.VO
,即使在a
中可以找到inner.VO
,但它在定义之前就被使用了?
答案 0 :(得分:3)
从我记忆中,提升导致inner
函数被解释为:
function inner(){
var a;
console.log(a);
a = 10;
}
因此,当您将a
分配给10时,它会查找范围,直到找到a
的定义,该定义位于var
函数内的inner
语句中。它认为没有必要走出去,所以它的行为就像a
函数中outer
不存在一样。此外,执行var a;
时,a
默认设置为undefined
。这就是为什么你看到undefined
输出的原因。
我会解释一下这个问题 Javascript解释器在遇到函数时执行以下操作(这称为执行上下文) A-创作阶段 1-第一步它创建了一个名为变量对象的不可访问的对象,它看起来就像你的外部函数
a: undefined
inner : pointer to function
2-它定义了函数的范围链和'this'的值
B-代码执行阶段 它逐行执行代码
如果遇到对尚未声明的函数的调用,它将执行它记住
inner : pointer to function
如果你在声明之前调用了inner(),那没关系,但这对匿名函数不起作用
因为它被视为任何变量
fn();
var fn = function () {..}
这不起作用,因为它的变量对象就是那个
fn: undefined