apply、call、bind區別、用法__javascript
來源:互聯網
上載者:User
apply和call都是為了改變某個函數運行時的上下文而存在的(就是為了
改變函數內部this的指向);
如果使用apply或call方法,那麼this指向他們的第一個參數,apply的第二個參數是一個參數數組,call的第二個及其以後的參數都是數組裡面的元素,就是說要全部列舉出來;
他們的
常用用法: 1.數組之間的追加; 2.擷取數組中的最大值和最小值,利用他們擴充範圍擁有Math的min和max方法; 由於沒有什麼對象調用這個方法,所以第一個參數可以寫作null或者本身; var numbers = [5, 458 , 120 , -215 ];
var maxInNumbers = Math.max.apply(Math, numbers), //458 maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458 3.驗證是否是數組(前提是toString()方法沒有被重寫過) function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ; } 4.讓類數組擁有數組的方法
比如arguments對象,擷取到的文檔節點等,並沒有數組的那些方法: Array.prototype.slice.apply(argument); //理論上來說這個比較快,直接在原型上尋找slice方法 //但實際上比較慢 或者 [].slice.apply(arguments); //理論上來說這個比較慢,因為要Array做一個執行個體化再尋找slice方法 //實際上比較快,因為現在的各種自動化工具會把上一種方法轉換為這種,而第二種代碼比較簡潔,所以會比較快;
bind()--也是改變函數體內this的指向; bind會建立一個新函數,稱為綁定函數,當調用這個函數的時候,綁定函數會以建立它時傳入bind()方法的第一個參數作為this,傳入bind()方法的第二個及以後的參數加上綁定函數運行時本身的參數按照順序作為原函數的參數來調用原函數;
bind與apply、call最大的區別就是:bind不會立即調用,其他兩個會立即調用 例子:
如果多次調用bind,那麼多出來的次數都是無效的,
三個的使用區別: 都是用來改變函數的this對象的指向的; 第一個參數都是this要指向的對象; 都可以利用後續參數傳參; bind是返回對應函數,便於稍後調用,apply、call是立即調用;