关于JS中this的问题?

阮一峰-this-(3)对象的方法

var obj ={
  foo: function () {
    console.log(this);
  }
};
obj.foo();             //{foo: ƒ}
(obj.foo)();         //{foo: ƒ}
(obj.foo = obj.foo)(); // window (小写的window是对象,大写的是构造函数)

在学 this的时候,阮一峰老师举例,没有看懂
为什么 (obj.foo = obj.foo)() // window左边的obj.foo重新赋值了一下,就变了来环境?this代表的的obj对象 变成了window对象

阅读 1.6k
4 个回答

在(obj.foo = obj.foo)()中
右边obj.foo表达式返回的是 obj.foo 的求值结果。而 obj.foo 的求值结果是一个纯粹的函数,因而在函数被调用的执行环境中,this 肯定不是原来的 obj 。

第三个你得这么理解
你先执行obj.foo = obj.foo, 返回的是右边的obj.foo

ƒunction () {
 console.log(this);
}

这时候相当于直接返回了一个方法,已经和 obj 没关系了,你在全局环境下执行这个方法,返回的就是 window

第一步得到 obj.foo 的函数引用值 value

foo: {
    [[value]]: function () {
          console.log(this);
    }
    ...
}

也就是

(obj.foo = function () {
  console.log(this);
})()

其次赋值给 obj.foo 属性,最后返回的是函数引用值value,该值执行 value(),也就是

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

所以 this 指向全局 window对象。

  • obj.fooobj作用域外 发生了自我赋值 运算(obj.foo = obj.foo), 得到一个‘新 this 指向’ 的 obj.foo并返回;
  • this 绑定的特点是:运行时绑定,所以新的 obj.foo 函数调用的时候 this 不在指向 obj, 而是 Window
  • 逗号运算符: (a, a++),从左边到右边一次求值,返回最后一个求职结果。
  • 下面也同理:
(false || obj.foo)() // window
(1, obj.foo)() // window
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏