1 function Person(name){ 2 var o = new Object(); 3 o.name=name; 4 o.sayname=function(){ 5 alert(name);//这里没加this 6 } 7 return o; 8 } 9 10 var p = Person('xia'); 11 p.name="wang"; 12 p.sayname();//xia 13 14 /*我的问题是*/ 15 /*为什么sayname函数打印的name值不随对象o.name而变化呢?*/ 16 /*既然函数Person返回的是对象o那么调用sayname函数作用域肯定是在o对象内*/ 17 /*那么第5行那里加不加this应该都没有区别才对呀*/
对啊,你alert的是name,又不是o.name
我调用alert的时候用的是p.sayname(),p应该是返回的对象o,那么name也应该是对象o作用域里面的name即o.name才对呀?
这涉及到作用域链查找和对象的概念....
没有添加this:
你调用sayname的时候js开始执行作用域链查找..找name,,第一步找sayname方法...发现没有申明name,,接着找Person的方法...OK.这时找到了name参数..所以就alert "xia"
添加this
调用sayname将首先确定this的上下文...this指向o这个对象..OK,,这个简单了...直接alert "wang"
推荐没事的时候看看<javascript高级程序设计>看完之后你对js的认识会有值的提升...
问题就在这里:
你调用sayname的时候js开始执行作用域链查找..找name,,第一步找sayname方法...发现没有申明name,,接着找Person的方法。
sayname()函数的活动对象肯定是在作用域链的第一个位置,下一个位置应该是对象o的变量对象,再往下才是Person的活动对象,引擎为什么在不加this的情况下跳过O的变量对象直接去Person找了呢?