1. 程式人生 > >apply、call、bind區別、用法

apply、call、bind區別、用法

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是立即呼叫;