我是javascript关闭概念的新手。据我所知,运行时调用对象存储对参数,局部变量和函数命名参数的引用。有了这个,我试着解决下面的片段。
function a(){
var o=10;
function b(){
alert(o);
var o=20;
alert(o);
}
alert(o);
b();
}
a();
我希望答案能够提醒10,20,20,但它是10,未定义,20。因为b的调用对象存储对所有局部变量的引用,所以b中的第一个警报(o)应该给出20,但是为什么undefined会来?即使在b()中,var o在alert(o)之后的某个时间点定义,对于那个场景,它不应该从父作用域访问o吗?有人可以透过一些亮点!
答案 0 :(得分:1)
因为b的调用对象存储对所有局部变量的引用
是。首先是局部变量,然后是父范围变量。
b中的第一个警报(o)应该给20,但为什么未定义?
这里有两个o
个变量:一个位于a
范围内,另一个位于b
范围内。由于提升,var o=20
的变量声明适用于整个b
范围,在调用o
时将b()
变量(最初未定义)引入范围。
也许这更有意义:
function a(){
var o; // hoisted
function b(){ // hoisted
var o; // hoisted
alert(o);
o=20;
alert(o);
}
o=10;
alert(o);
b();
}
a();
顺便说一下,你还没有经历过closure,它的显着特点是父作用域与子函数对象持久存在,即使父函数有return
ed。