this指向: 永远指向它的调用者; 官方说法:执行上下文(执行环境)
1、普通函数this指向--->Window
function fn1() {
console.log(this);
}
fn1();
2、在对象中this指向--->当前对象
var obj = {
a : 1,
b : function () {
console.log(this);
}
}
obj.b();
3、在构造函数中this指向--->实例对象
function Person(name) {
this.name = name;
console.log(this);
}
var p1 = new Person('王憨憨');
4、在定时器中this指向--->Window
setInterval(() => {
console.log(this);
}, 1000)
5、在绑定事件中this指向--->当前事件对象
document.onclick = function () {
console.log(this);
}
6、箭头函数不会改变this指向
在vue中我平常使用的时候;一般情况下都会 let vm = this
methods: {
add(){
let vm = this;
}
}
但是在写代码的过程中,难免会遇到需要修改this指向的情况,这个时候就需要使用我们修改this指向的三种方法了。
- call
- apply
- bind
var obj = {
a: 1,
b: 2
}
function fn1(a, b) {
console.log(this, a, b);
}
修改this指向三张方法的格式以及注意事项:
- call apply:改变this的指向 ,call直接调用,而apply需要重新调用这个函数
- call传参数:call(this指向的,参数1,参数2...);
- apply传参数:apply(this指向的,[参数1,参数2...]); --->apply传参数是一个数组
- bind传参数:bind
强制修改this指向的调用格式:
fn1.call(obj);
fn1.apply(obj);
fn1.bind(obj)();
强制修改this指向的传参语法:
fn1.call(obj, 1, 2);
fn1.apply(obj, [3, 4]);
fn1.bind(obj)(5, 6); // bind传参在react框架用的比较多些