...

前端開發:詳細講解this指向相關的(de)知識

2021-07-07

首先來(lái)了(le/liǎo)解一(yī / yì /yí)下this指向的(de)優點好處:在(zài)特定函數和(hé / huò)寫法中,this可以(yǐ)方便快捷的(de)引用對象,使得寫法簡單容易複用和(hé / huò)代碼簡潔精簡。

一(yī / yì /yí)、this指向不(bù)同是(shì)由函數調用方式決定的(de)

1、普通函數的(de)調用

this指向windoweg:

 function fun() {
       console.log(this);   //指向window     }
     window.fun();

2.構造函數的(de)調用,this指向實例對象

     function Student(age, name) {

         this.age = age;

         this.name = name

         console.log(this)  //this分别指向Student的(de)實例對象s1、s2     }

    var s1 = new Student(18, 'ls')

    var s2 = new Student(18, ‘cc’)

3.對象方法的(de)調用,this指向該對象方法所屬的(de)對象

    var obj = {
       fun: function () {
         console.log(this);  //指向obj       }
    }

    obj.fun();

4.定時(shí)器函數的(de)調用,this指向window

<body>
  <button id="btn">cc</button>
  <script>
    var objBtn = document.getById("btn");
    objBtn.onclick = function() {
            console.log(this); // 指向btn
    }
 </script>
</body>

6.箭頭函數的(de)調用,this指向父級對象

var obj = {

    a: 1,

    fun: () => {

        console.log(this); //this指向了(le/liǎo)obj的(de)父級對象window
    }
}

obj.fun();  //指向window

7.匿名函數的(de)調用,this指向全局變量window

(function fun() {

    console.log(this); //this指向全局變量window
})();

二、更改this指向的(de)三個(gè)方法

每一(yī / yì /yí)個(gè)function構造函數的(de)都有是(shì)三個(gè)方法:call(), apply(), bind(),也(yě)就(jiù)是(shì)這(zhè)三個(gè)方法可以(yǐ)更改this的(de)指向,但是(shì)call(), apply()隻能在(zài)特定作用域調用函數,而(ér)bind()方法會創建一(yī / yì /yí)個(gè)函數實例,然後this會被綁定到(dào)bind()上(shàng)面。

1.call() 方法

把普通函數的(de)this指向window的(de),更改this指向,eg:

var Student = {

        name:”caicai”,

        age:25

    }

    function fun(x,y){

        console.log(x+","+y);

        console.log(this);

    }

    fun(“ll”,30);

修改上(shàng)面例子(zǐ)的(de)更改this指向,如下所示:

var Student = {

        name:"caicai",

        age:25

  }

    function fun(x,y){

        console.log(x+","+y);

        console.log(this);

        console.log(this.name);

    }

    fun.call(Student,”ll”,30);  //現在(zài)this就(jiù)指向Student了(le/liǎo)

2.apply() 方法

apply() 方法與call()很類似,它們的(de)不(bù)同之(zhī)處在(zài)于(yú)提供參數的(de)方式,apply()使用參數數組,而(ér)不(bù)是(shì)參數列表

<script>

    var Student = {

        name:"caicai",

        age:25

  }

function fun(x,y){

        console.log(x+","+y);

        console.log(this.age);

    }

   aa.call(Student,1,2);

   aa.apply(Student,[1,2]);

</script>

3.bind()方法

bind()方法創建的(de)是(shì)一(yī / yì /yí)個(gè)新函數(也(yě)稱爲(wéi / wèi)綁定函數),它和(hé / huò)被調用函數有相同的(de)函數體。當目标函數被調用時(shí),this的(de)值就(jiù)會綁定到(dào)bind()的(de)第一(yī / yì /yí)個(gè)參數上(shàng)面。

<script>

    var Student = {

        name:"caicai",

        age:25

  }

function fun(x,y){

        console.log(x+","+y);

        console.log(this.age);

    }

aa.call(Student,1,2);

aa.apply(Student,[1,2]);

aa.bind(Student,1,2)();  //必須調用,不(bù)然就(jiù)隻是(shì)單純的(de)綁定而(ér)已

</script>

4. 存儲this指向到(dào)變量裏面

var obj = document.getById("obj");

obj.onclick = function () {

    var _this = this; //把this儲存在(zài)變量中,且不(bù)改變定時(shí)器的(de)指向

setTimeout(function () {

       console.log(this); //指向window

                 console.log(_this); //this對當前對象的(de)引用

          }, 2000);

}

以(yǐ)上(shàng)就(jiù)是(shì)本章全部内容,歡迎關注三掌櫃的(de)微信公衆号“程序猿by三掌櫃”,三掌櫃的(de)新浪微博“三掌櫃666,歡迎關注!

© 著作權歸作者所有


來(lái)源:大(dà)前端