都是指向调用者,但是有细分区别:
1.普通函数this指向window,调用者。(严格模式下是undefined)
(用new调用就是构造函数)
2.构造函数this指向实例化对象。
3.方法:调用者对象例如:
let arr = {
uname: '学者',
fei : function() {
console.log(this);
}
}
arr.fei();
4.事件处理函数指向事件源,比如说下面的document;
document.addEventListener('click', function () {
console.log(this);
})
5.定时器setinterval中的this指向window,调用者;
6.自调用函数(也叫立即执行函数)调用者window,调用者:
特殊:
1.箭头函数
箭头函数中的 this 与普通函数完全不同,也不受调用方式的影响,事实上箭头函数中并不存在 this !箭头函数中访问的 this 不过是箭头函数所在作用域的 this 变量。
改变this指向:
都是函数的方法,只能用函数调用
1.call
(1)使用 call 方法调用函数,同时指定函数中 this 的值.
(2)使用call方法调用函数时,第一个参数为this制定的值
(3)call方法的其余参数会依次自动传入函数做为函数的参数
用法:call(this, arg1,arg2.....)
2.apply
用法:函数.apply(this, [arg1,arg2,......])
特殊玩法:改变Math.max的指向,让数组直接穿进去(正常可以使用Math.max(...arr)
let arr = [23, 66, 33, 19, 4, 7];
let re = Math.max.apply(null, all);
console.log(re)
3.bind(区别于call,apply,他改完之后不会立即执行而是相当于创建了一个新的改变this之后的函数,而call,apply立马执行)
用法:函数.bind(this, arg1, arg2,......);
玩法:
let btn = document.querySelector('input');
btn.addEventListener('click',function(){
// 禁用按钮
this.disabled = true;
//开启定时器
window.setTimeout(function(){
this.disabled = false;
}.bind(this),5000);
});
这里的bind(更改了定时器里面的this指向,不再是window而是btn调用者)