var name = "outter object";
var object = { name : "inner Object",
getNameFunc : function(){ return function(){ return this.name; };
}
};
alert(object.getNameFunc()());
如上代码,为什么弹出的是outter object?谢谢
这个要理解执行环境的原理(相信你应该明白,不多讲),代码应该分一下几个阶段来解释
定义阶段:就可以看出你代码定义的执行环境(虽然权威书上不这么说,但更好理解些)的嵌套关系,全局执行环境里嵌套着object的执行环境,object执行环境里嵌套着第一个function执行环境,也就是getNameFunc,好了,为什么不说第二个function执行环境,下面第二阶段说明白。
执行阶段:object.getNameFunc()(),代码执行其实就是按照你的代码规则有规则的来执行你定义的执行环境,读取object时,代码进入object的执行环境,读取getNameFunc()时,进入第一个函数执行环境,重点来了,函数执行环境遇到return后,就说明人家执行环境已完成,就退回外层的执行环境Object,外层没东西执行,就再退回到全局的了,此时执行环境是全局执行环境window对象了,你return的function(把它看成变量,没什么特殊的)就是全局的一个变量了,你要求人家再次执行,就是读取最后一个(),那人家就进入这个function的匿名函数的执行环境(也就是前面说的第二个function执行环境,它在定义阶段的嵌套关系其实是和object平级的),执行里面的this.name中的this指的是调用这个执行环境执行的对象了,这里是全局执行环境window对象了,所以它返回的是outter object
函数里面的this 指的是调用当前方法的对象
var object = { name : "inner Object", getNameFunc : function(){ return function(){ return this.name; }; } };
object.getNameFunc() 这个方法返回的是
function(){ return this.name; };
这个时候调用这个方法的对象是window,而不是object
所以 this.name = window.name
对,主要要弄清楚this是指什么,this是指 调用当前方法的 对象。楼上说的很清楚了