函数this指向

在看高程不知道第几遍的时候,一直以为以前自己理解的东西,突然却懵逼了

var name='thi window';
var obj = {
    name:'the obj',
    getName:function(){
        console.log(this);
        console.log(this.name);
    }
}
obj.getName();
(obj.getName)();
(obj.getName=obj.getName)();

第三个输出的是打印the window
测试过比如var ty;
(ty = obj.getName)()//the window
高程那边解释是先复制在执行,改变了this的指向,
测试也确实是这么回事,如果直接调用执行this是obj的
只要赋值在执行为撒指向就改变了呢?
假如分开写的话能理解
比如 var ty = obj.getName;
ty();//the window
这样写能理解,但是那个括号赋值并执行有点理解不过来啊,我也只能强制自己记住如果赋值在执行this就改变
各位有更好的理解和看法吗?

阅读 2.6k
5 个回答

赋值的时候把函数赋值给变量,但是函数的this没办法赋值过去啊,所以再调用时,默认就是一个独立的函数调用,this就丢失了!
我觉得这个更简单直接一些:http://www.cnblogs.com/xiaohu...

这个怎么说呢?
拿第一个和第三个比:
调用的时候,都是在window下执行的!!!都是在window下执行的!!!都是在window下执行的!!!
第一个 是window的obj的getName。。。。他从window跑到了obj对吧。他的爸爸是谁?是window的obj 对吧。
而第三个 赋值的时候。。window的obj的getName = window的obj的getName,赋值操作是先找到左边的obj的getName。。好了。貌似跑到了obj。。。但是他右边是谁是window的obj的getName...所又他要跑回window...
等号左侧的getName和 右侧的getName 不想等。
clipboard.png
所以共同的爸爸就是祖先window

括号里面的表达式,返回值就是getName 函数,前一个括号返回,后一个括号执行,那么就相当于是自己执行的,而不是 obj 调用的。自己执行的 函数内 this 指向的是 window。

图片描述

所以实际上就是在window上调动了这个函数, this就是window了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题