关于this指向的一个疑问

var name = "the window";
var object = {
    name: "My Object",
    getName: function () {
        console.log(this.name)
    }
}

object.getName();   //My Object
(object.getName)(); //My Object

(object.getName)()不是相当于

(function () {
    console.log(this.name)
})();

一个匿名函数自执行吗?不是应该指向 window 吗?
为什么还是指向了 object
上面的两次不同的执行有什么区别?

阅读 2.8k
5 个回答

这个跟this指向没有关系,你是对运算符优先级有误解,看这里

这里说明一下成员访问符【.】函数调用符【()】的优先级,他们本来优先级一样高(级别19),而且是从左到右的,什么意思呢?
数学运算:a + b - c(a + b) - c,有区别吗?完全没有,括号就是多余。
所以:object.getName()(object.getName)()就是一回事。

() 会“原样返回”其中得结果。所以,如果不改变执行顺序的话, 加不加 () 一个样。

object.getName()(object.getName)() 本来就是等效的,因为运算符优先级本就如此。

重要声明:这不是回答题主的问题!只是根据题主的问题,猜测其问题来源,并找出了对应于问题的代码,方便对比理解!!!!

我记得有一个类似的问题,找了半天,总算找到了

const obj = {
    test() {
        console.log("this is: ", this.toString());
    }
};

obj.test();                 // [object Object]
(obj.test)();               // [object Object]

(obj.test = obj.test)();    // [object global]

就是这段代码的最后一句,这里 this 是批向了 global,如果是浏览器环境就是 [object Window]

不过这里的情况不同,关键在于前面是一个赋值语句。赋值语句是有返回值的(因此可以使用连等),返回的是被赋的那个值,在这里就是一个“无根”函数,相当于

const test = obj.test = obj.test;
test();     // 这时候 this 就指向 global 了

再次声明:这不是回答题主的问题!只是根据题主的问题,猜测其问题来源,并找出了对应于问题的代码,方便对比理解!!!!

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