1. 在函數(shù)內部的this指向
this 的指向,是當我們調用函數(shù)的時候確定的。調用方式的不同決定了this 的指向不同,一般指向我們的調用者。
| 調用方式 | this指向 |
|---|---|
| 調用方式 | this指向 |
| 普通函數(shù)調用 | window |
| 構造函數(shù)調用 | 實例對象 原型對象里面的方法也指向實例對象 |
| 對象方法調用 | 該方法所屬對象 |
| 事件綁定調用 | 綁定事件對象 |
| 定時器函數(shù) | window |
| 立即執(zhí)行函數(shù) | window |
代碼示例:
/* 1. 普通函數(shù) */ //this 指向window
function fn() {
console.log('人生的巔峰');
}
fn();
/* 2. 對象的方法 */ //this指向的是對象 o
var o = {
sayHi: function() {
console.log('人生的巔峰');
}
}
o.sayHi();
/* 3. 構造函數(shù)*/
// this 指向 ldh 這個實例對象 原型對象里面的this 指向的也是 ldh這個實例對象
function Star() {};
new Star();
/* 4. 綁定事件函數(shù)*/ //this 指向的是函數(shù)的調用者 btn這個按鈕對象
btn.onclick = function() {}; // 點擊了按鈕就可以調用這個函數(shù)
/* 5. 定時器函數(shù)*/ this還是指向window
setInterval(function() {}, 1000); //這個函數(shù)是定時器自動1秒鐘調用一次
/* 6. 立即執(zhí)行函數(shù)(自調用函數(shù))*/ //this還是指向window
(function() {
console.log('人生的巔峰');
})();
2. 改變函數(shù)內部 this 指向
2.1 call方法
call()方法調用一個對象。簡單理解為調用函數(shù)的方式,但是它可以改變函數(shù)的 this 指向
應用場景: 經常做繼承:
第一個值可以改變函數(shù)的指向
- call 作用:第一個可以調用函數(shù) 第二個可以改變函數(shù)內的this 指向
- call 的主要作用可以實現(xiàn)繼承
var o = {
name: 'andy'
}
function fn(a, b) {
console.log(this);
console.log(a+b)
};
fn()// 此時的this指向的是window
fn.call(o,1,2)//此時的this指向的是對象o,參數(shù)使用逗號隔開
2.2 apply方法
apply() 方法調用一個函數(shù)。簡單理解為調用函數(shù)的方式,但是它可以改變函數(shù)的 this 指向。
應用場景: 經常跟數(shù)組有關系:
1. 也是調用函數(shù) 第一個值可以改變函數(shù)內部的this指向
2. 但是他的參數(shù)必須是數(shù)組(偽數(shù)組)
3. apply 的主要應用 比如說我們可以利用 apply 借助于數(shù)學內置對象求數(shù)組最大值
var o = {
name: 'andy'
}
function fn(a, b) {
console.log(this);
console.log(a+b)
};
fn()// 此時的this指向的是window
fn.apply(o,[1,2])//此時的this指向的是對象o,參數(shù)使用數(shù)組傳遞
2.3 bind方法
bind() 方法不會調用函數(shù),但是能改變函數(shù)內部this 指向,返回的是原函數(shù)改變this之后產生的新函數(shù)
如果只是想改變 this 指向,并且不想調用這個函數(shù)的時候,可以使用bind
應用場景:不調用函數(shù),但是還想改變this指向
// 1. 不會調用原來的函數(shù) 可以改變原來函數(shù)內部的this 指向
// 2. 返回的是原函數(shù)改變this之后產生的新函數(shù)
// 3. 如果有的函數(shù)我們不需要立即調用,但是又想改變這個函數(shù)內部的this指向此時用bind
// 4. 我們有一個按鈕,當我們點擊了之后,就禁用這個按鈕,3秒鐘之后開啟這個按鈕
var btns = document.querySelectorAll('button');
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function () {
this.disabled = true;
setTimeout(function () {
this.disabled = false;
}.bind(this), 2000);
}
}
2.4 call、apply、bind三者的異同
共同點 : 都可以改變this指向
-
不同點:
- call 和 apply 會調用函數(shù), 并且改變函數(shù)內部this指向.
- call 和 apply傳遞的參數(shù)不一樣,call傳遞參數(shù)使用逗號隔開,apply使用數(shù)組傳遞
- bind 不會調用函數(shù), 可以改變函數(shù)內部this指向.
-
應用場景
- call 經常做繼承.
- apply經常跟數(shù)組有關系. 比如借助于數(shù)學對象實現(xiàn)數(shù)組最大值最小值
- bind 不調用函數(shù),但是還想改變this指向. 比如改變定時器內部的this指向.