JS作用域问题4,示例1和2的输出疑问
第一个的fn()输出为什么是undefined,第二个fn()的输出却是1?
第一个的例子中,预解析时a=undefined,但是执行时不是和示例2中一样,
都是先执行了一下var a = 1;
fn()的输出应该都是1,不是吗?
这个点是不是没有讲出来?
正在回答 回答被采纳积分+1
函数预解析过程
① 创建一个AO对象(activation object)
② 找形参和变量声明的名 ,作为AO对象的属性名(初始都为undefined)
③ 将实参的值与形参的值相统一
④ 找函数声明,并把属性值写全。如果有与②中重复的属性名,则不写属性名,直接覆盖②的属性值。
你可以按照上面预解析的步骤来理解,首先是预解析阶段:
var a = 1; function fn(){console.log(a); var a = 2;} fn(); console.log(a);
从步骤2可以看出来,在预解析的时候,a = underfind; 然后在fn()预解析的时候 a = underfind,所以console.log(a)的值是underfind。当fn预解析完了之后,a 由underfind变成了1,所以第二个console.log(a)的值是1;
var a =1; function fn(){console.log(a);a=2;} fn();console.log(a);
在预解析的时候, a = underfind;然后在fn()预解析的时候,没有搜索到以var开头的声明,所以fn()就没有预解析了,然后在看a由underfind变成了1,所以fn()执行的时候,console.log(a)的值就是1了,由于fn中 a = 2 是个全局变量,所以a由1变成了2,所以 console.log(a)的值就变成了2了
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星