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 是隐式绑定丢失吗?
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 是隐式绑定丢失吗?
关键在于:函数调用者是谁。
对于 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
的来源是在函数声明处,而不是调用处。
27 回答13k 阅读
8 回答3.5k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
5 回答5.3k 阅读✓ 已解决
4 回答1.6k 阅读✓ 已解决
3 回答1.7k 阅读
4 回答2.3k 阅读✓ 已解决
obj.foo()调用printA,是谁在调用?是obj,所以this指向obj
printA()调用,是谁在调用?没有谁在调用,所以this是无主的,非严格模式下指向window
this指向谁就看调用的就行,通俗点讲就是
.
前面的对象(经过call、apply、bind等操作的函数除外)