this指向可分为如下四种情况:
- 函数预编译过程 this ——> window
- 全局作用域里 this——> window
- call/apply 可以改变函数运行时this指向
- obj.func(); func()里面的this指向obj (谁调用方法,方法里的this指向谁)
var name = '222';
var a = {
name: '111',
say: function() {
console.log(this.name);
}
}
var fun = a.say;
fun();
a.say();
var b = {
name: '333',
say: function(fun) {
fun();
}
}
b.say(a.say);
b.say = a.say;
b.say();
第九行执行函数fun,因为第八行将a.say赋值给fun,而fun在全局执行,所以this现在的指向为window,故输出结果为’222’
第十行执行a.say,a对象调用方法,this指向a对象,输出结果为’111’
十七行,将a.say作为参数,调用b对象的say方法,虽然看起来适用于总结的第四种情况。可实际上,b对象的c方法并没有直接输出,而是执行作为参数的a.say,所以适用于第一种情况,输出’222’
十九行b对象调用方法,this指向b对象,输出结果为’333’
本文根据渡一教育JavaScript视频总结,有兴趣的可去b站搜索观看。
https://www.bilibili.com/video/av64563473?t=4640&p=24