最近无意中看到一个人发的js问题截图。看起来挺有意思的,发出来大家讨论下,并附上个人的理解。方便大家交流。
这些问题是对初看起来觉得比较复杂。自己分析下,也不是那么难。顺便复习一下。
先看第一个问题,当代码执行e()时。执行第一句f.call(e),相当于e.f(),执行完后e就多一个属性a和一个方法b,即e.a='A',继续往下执行下一句alert(a),因为a没有定义,外层也没有a的定义,而JS中不允许直接使用未声明的变量。所以这段代码会报错。
再看第二个问题,这个问题和第一个问题唯一不一样的地方就是f.call(e.t),很明显的是e.t这个东西不存在,所以值为undifined,而js中f.call(undefined)或f.call(null)相当于window.f(),所以执行完后,window会多出一个属性a,window.a='A'和一个方法b,往下执行下一句,在e中没有a这个属性,但在顶层作用域中即window有a这个属性,所以就弹出了A
再看第三个问题吧,和第一个不同的地方也在f.call(y.t),错误同第一个,因为使用了未声明的变量y,所以报错。
再看第四个问题吧,根据第一个问题的分析,执行完f.call(e)这个之后,e.a='A'。所以这个弹出A。
主要复习一下几点:
1.call方法的参数是undefined或null时相当于window调用。
2.javascript不能直接使用未声明的变量。
3.javascript的查找顺序。
管理员 世纪之光 : 2013年06月14日21:31:14 -49楼
管理员 世纪之光 : 2013年06月26日09:11:09 地下1层