JS中this的指向

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指向.
  • 應用場景

    1. call 經常做繼承.
    2. apply經常跟數(shù)組有關系. 比如借助于數(shù)學對象實現(xiàn)數(shù)組最大值最小值
    3. bind 不調用函數(shù),但是還想改變this指向. 比如改變定時器內部的this指向.
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • This是一個關鍵字,它代表函數(shù)運行時,自動生成的一個內部對象,只能在函數(shù)內部使用。 this 是在函數(shù)被調用時確...
    24h迭代人生閱讀 372評論 0 0
  • 大家好,我是IT修真院北京總院第29期的學員禚洪宇,一枚正直、純潔、善良的前端程序員今天給大家分享一下,修真...
    晚_cc3a閱讀 263評論 0 0
  • 首先必須要說的是,this的指向在函數(shù)定義的時候是確定不了的,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰,實際上...
    雪妮爸爸閱讀 253評論 0 0
  • 先“死記硬背”以下幾條規(guī)律:1、在函數(shù)體中,非顯式或隱式的簡單調用函數(shù)時,在嚴格模式下,函數(shù)內的this會被綁定到...
    少_游閱讀 195評論 0 0
  • 首先必須要說的是, this的指向在函數(shù)定義的時候是確定不了的,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰,實際...
    w晚風閱讀 274評論 0 18

友情鏈接更多精彩內容