JavaScript中this指针的变化?

为什么第一次this指向的全局,第二次指向了obj,调用不是一样的吗,还是第一次赋值的时候作用域链有所变化?希望大神能给指点一下,谢谢了!

var name = 'ddd';
var obj = {
   name: "zcl",
   getName: function(){
       return this.name;
   }
}

console.log((obj.getName = obj.getName)());
console.log(obj.getName());

result1:ddd
result2:zcl

阅读 3.5k
5 个回答
obj.getName = obj.getName

这是一个赋值表达式,关键它会返回一个值
举例:
clipboard.png

所以(obj.getName = obj.getName)()等同于(function(){return this.name;})()
至于this的调用就不多说了,有很多资料可以查看,最简单的办法this始终指向调用者(this的指向是在执行时而非定义时确定)

作用域链一旦确定是不会改的,你主要是对赋值表达式理解错误了,比如a = b,这只是一个赋值语句,把b中引用的值赋给了a,操作完之后就结束了,之后跟a是什么没有关系。主要是赋值表达式有副作用,它返回了b引用的值。比方说b的值是1,那么a = b它的返回结果就是1。

//上文中
obj.getName = obj.getName      //有个返回值 function(){
                               //             return this.name;
                               //         }
//因此
(obj.getName = obj.getName)()   //相当与如下

(function(){
      return this.name;
})()
//显而易见this指向的是window,所以输出的是ddd

this和函数调用的方式有关,第一个obj.getName其实就是function(){ return this.name; },你把这个函数赋给obj.getName然后执行其实就是匿名函数直接执行,this指向window,也就是ddd,第二个是对象方式调用当然this就指向obj

首先,this是运行时的概念。在这里,getName()函数被包含在一个对象中,所以采用隐式绑定,隐士绑定this指向该对象。但当此函数被赋值时,它将失去隐式绑定,采用默认绑定,而默认绑定的情况下,this是指向调用栈中前一个调用函数的,在这里是window。

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