1.改变this指向的方法:
①箭头函数:没有自己的指向,与上下文一致。
let a = 100;
let obj = {
a: 1,
fn() {
//this->obj
console.log(this.a);
setTimeout(() => {
//this->obj
console.log(this);//obj
console.log(this.a);//1
}, 1000);
}
}
obj.fn()
let test = obj.fn;
test();
// test->内部的this是window
// 延时器的箭头函数的环境变成 了 window
②bind(this,参数1,参数2) 返回一个新的函数,改变新函数中this指向为bind的第一个参数,参数1,参数2主要是给新的函数传递实参。
function fn() {
let info = '昨天下了一天的雨...';
console.log(this, info);
}
let obj = {
name: '郝五一'
}
let fn1 = fn.bind(obj);
console.log(fn1);
fn1();
③call(this指向,参数1,参数2...) 改变this指向,是调用它的函数,给函数传递参数以单个参数的形式传递。
function goods(name, price) {
console.log(name, price, this);
}
goods.call(obj,'睡觉',28);
④apply(this指向,[参数1,参数2...]) 改变this指向,是调用它的函数,是以数组的形式给函数传递参数。
function goods(name, price) {
console.log(name, price, this);
}
goods.apply(obj, ['打游戏', 18]);
补充:apply() 给函数传递参数都是以数组的形式,被函数或方法接受的时候会自动展开。
let arr = [33,22,11,3,56,77];
let res = Math.min.apply({},arr);
console.log(res);
2.总结:
①bind一般用在不立即调用的函数上,回调函数(事件,延时器和定时器)
②call/apply 立即调用又要改变this指向的