bind、apply、call的區別


改變函數內部this指針的指向函數:

通過apply和call改變函數的this指向,他們兩個函數的第一個參數都是一樣的表示要改變指向的那個對象,第二個參數,apply是數組,而call則是arg1,arg2...這種形式。通過bind改變this作用域會返回一個新的函數,這個函數不會馬上執行。

 

call()和appl()的理解

每個函數都包含兩個非繼承而來的方法:apply()和call()

1.這兩個方法的用途:在特定的作用域中調用函數,實際上等於設置函數體內this對象的值

(1)apply()方法接收兩個參數:一個是在其中運行函數的作用域,里一個是參數數組(Array的實例或者arguments對象)

function sum(num1,num2){

return num1 + num2

}

function callSum(num1,num2){

return sum.apply(this,arguments);

}

alert(callSum(10,10));//20

callSum()在執行sum()函數時傳入了this作為this值(因為是全局調用的,所有傳入的就是window對象)和arguments對象

(2)call()方法與apply()的作用相同,區別在於接受參數的方式不同,call第一個參數是this值沒有變化,變化的是其余參數都直接傳給函數。

function sum(num1,num2){

return num1 + num2

}

function callSum(num1,num2){

return sum.call(this,num1,num2);

}

alert(callSum(10,10));//20

2.apply()和call()真正強大的地方是能擴充函數賴以運行的作用域。

window.color = "red"

var o = {color:"blue"};

function sayColor(){

alert(this.color);

}

sayColor(); //red

sayColor.call(this);//red

sayColor.call(window);//red

sayColor.call(o);//blue(就算此時再sayColor函數里面添加 var color = “red”,結果仍然是blue,因為sayName函數體內的this已經指向o了)

解釋:sayColor()作為全局函數定義,當在全局作用域中調用它時,就會顯示red;sayColor.call(this)中的this就是wimdow,和sayColor.call(window)一樣,都是在全局作用域中調用sayColor(),結果還是會顯示‘red’,

但是當運行sayColor.call(o)時,函數的執行環境就不一樣了,因為此時函數體內的this對象指向了o,結果是顯示blue

使用call()和apply來擴充作用域的最大好處就是不需要與方法有任何耦合關系


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM