this指向问题?

var a = 1;
function printA(){
  console.log(this.a);
}
var obj={
  a:2,
  foo:printA,
  bar:function(){
    printA();
  }
}
 
obj.foo(); // 2
obj.bar(); // 1
var foo = obj.foo;
foo(); // 1

请问,为什么printA() 在bar中执行他的this会指向window 是隐式绑定丢失吗?

阅读 1.5k
3 个回答

obj.foo()调用printA,是谁在调用?是obj,所以this指向obj

printA()调用,是谁在调用?没有谁在调用,所以this是无主的,非严格模式下指向window

this指向谁就看调用的就行,通俗点讲就是.前面的对象(经过call、apply、bind等操作的函数除外)

关键在于:函数调用者是谁

对于 obj.bar() 来说,bar() 当中的 printA() 并不是由对象 obj 调用的,只是在其 bar() 里面使用而已,与对象 obj 无关。


扩展一下,换个场景,若是 printA() 是一个箭头函数,表现会如何呢?

const printA = () => {
    console.log(this.a);
}

其他代码不变的情况下,输出结果都变成了 1。可能很怪,为什么没有使用 obj.bar() 当中的 this

var obj={
  a: 2,
  foo: printA,
  bar: function(){
    console.log(this === obj); // true    
    printA();
  }
}

因为箭头函数继承外界 this 的来源是在函数声明处,而不是调用处。

推荐问题
宣传栏