首頁 web前端 js教程 js中call、apply和bind的區別和原理及擴展的高級運用

js中call、apply和bind的區別和原理及擴展的高級運用

Jul 04, 2020 am 09:58 AM
apply bind

前言

在面試的過程中,會有許多新問題出現讓你拓展新的知識,也會發現學習中忽略的點。

在前兩天的一次面試中,面試官就問了call、apply和bind的差別。事實上,我們也應該領悟得到面試官更想問的東西是什麼,也就是拓展出來的東西。


call

call是所有函數都能呼叫的方法,是Function.prototype裡的方法

作用

  1. 呼叫函數

  2. 改變this,作為第一個參數

  3. #傳遞參數,第二個參數之後的所有個數的參數

案例

1

2

3

4

5

6

7

8

function fn1(){

    console.log(1);

}

function fn2(){

    console.log(2);

}

fn1.call(fn2); //输出 1

fn1.call.call(fn2); //输出 2

登入後複製

#解析
第一行輸出,呼叫了fn1並將this指向fn2
第二行輸出,事實上,執行的call()才是關鍵,這裡就涉及了Function.prototype.call()的機制,它只是把.call()之前的程式碼段當作一個變量,將傳遞的程式碼段指向this,則fn1.call指向了fn2,於是就相對於fn2.call(),只是這裡傳遞的thiswindow

#運用

  • 繼承的方法

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

      function Father(uname,age){

          this.uname= uname;

          this.age=age;

      }

      Father.prototype={

          constructor:Father,

          sing:function(){

              console.log("唱跳rap");

          }

      }

      function Son(){

          Father.call(this,uname,age)

      }

      Son.prototype=new Father();

    登入後複製

#apply

apply同樣也是所有函數都能呼叫的方法,是Function.prototype裡的方法

作用

  1. 呼叫函數

  2. 改變this

  3. 傳遞參數,第二個參數之後的所有陣列參數

#與call的差異

apply第二個參數是Array,而call是將參數以個數的形式傳入

使用

  • 運用Math函數取得最大值

    1

    2

    3

      let arr=Array.of(2,42,56,89,1,24,56,22)

      let max=Math.max.apply(Math,arr)

      console.log(max);

    登入後複製

  1. ##bind

bind同樣也是所有函數都能呼叫的方法,是

Function.prototype

裡的方法

作用

改變this傳遞參數,第二個參數之後的所有個數參數

傳回新函數

###與call、apply的區別######與前兩者的最大不同就是不會呼叫函數並且修改後返回新的函數######運用###

1

2

3

4

5

6

7

8

9

let btns=document.querySelectorAll("button")

for(let btn of btns){

    btn.onclick=function(){

        this.disabled=true;

        setTimeout(function(){

            this.disabled=false;

        }.bind(this),2000);

    }

}

登入後複製
###上面的案例修改了定時器的###this###,同時不會呼叫函數。但事實上如果你用了箭頭函數的寫法,因箭頭函數的###this###是關乎上下文的###this###,因此會簡單許多,這個案例意在給我們理解### bind###的用法,那麼在下面附上箭頭函數的寫法###

1

2

3

4

5

6

7

8

9

let btns=document.querySelectorAll("button")

for(let btn of btns){

    btn.onclick=function(){

        this.disabled=true;

        setTimeout(()=>{

            this.disabled=false;

        },2000);

    }

}

登入後複製
###推薦教學:《###JS教學###》###

以上是js中call、apply和bind的區別和原理及擴展的高級運用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

兩個點博物館:邦格荒地地點指南
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

兩個點博物館:邦格荒地地點指南
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在JavaScript中替換字符串字符 在JavaScript中替換字符串字符 Mar 11, 2025 am 12:07 AM

在JavaScript中替換字符串字符

jQuery檢查日期是否有效 jQuery檢查日期是否有效 Mar 01, 2025 am 08:51 AM

jQuery檢查日期是否有效

jQuery獲取元素填充/保證金 jQuery獲取元素填充/保證金 Mar 01, 2025 am 08:53 AM

jQuery獲取元素填充/保證金

前5個日期操縱JS插件 前5個日期操縱JS插件 Feb 28, 2025 am 12:34 AM

前5個日期操縱JS插件

10個jQuery手風琴選項卡 10個jQuery手風琴選項卡 Mar 01, 2025 am 01:34 AM

10個jQuery手風琴選項卡

10值得檢查jQuery插件 10值得檢查jQuery插件 Mar 01, 2025 am 01:29 AM

10值得檢查jQuery插件

jQuery添加捲軸到Div jQuery添加捲軸到Div Mar 01, 2025 am 01:30 AM

jQuery添加捲軸到Div

HTTP與節點和HTTP-Console調試 HTTP與節點和HTTP-Console調試 Mar 01, 2025 am 01:37 AM

HTTP與節點和HTTP-Console調試

See all articles