call apply bind
在JavaScript中,call
、apply
和bind
是Function
對象自帶的三個方法,這三個方法的主要作用是改變函數中的this
指向。
call
、apply
、bind
方法的共同點和區別:apply
、 call
、bind
三者都是用來改變函數的this對象的指向的;
apply
、 call
、bind
三者第一個參數都是this要指向的對象,也就是想指定的上下文(函數的每次調用都會擁有一個特殊值——本次調用的上下文(context)——這就是this
關鍵字的值。);
apply
、 call
、bind
三者都可以利用後續參數傳參;
bind
是返回對應函數,便於稍後調用;apply
call
則是立即調用 。
apply和call作用完全一樣,只是接受參數的方式不同,call是一個接一個,apply是數組形式(如果不是一個有效的數組或者不是 arguments 對象,那麽將導致一個 TypeError)
a.call(thisObj,arg1,arg2...)
a代表一個方法
thisObj
的取值有以下4種情況:
(1) 不傳,或者傳null,undefined, 函數中的this指向window對象
(2) 傳遞另一個函數的函數名,函數中的this指向這個函數的引用
(3) 傳遞字符串、數值或布爾類型等基礎類型,函數中的this指向其對應的包裝對象,如 String、Number、Boolean
(4) 傳遞一個對象,函數中的this指向這個對象
a.call(); //window
a.call(null); //window
a.call(undefined); //window
a.call(1); //Number
a.call(‘‘); //String
a.call(true); //Boolean
a.call(b); //function b(){}
a.call(c); //Object
bind是ES5新增的方法
bind方法會創建一個新函數,稱為綁定函數,當調用這個綁定函數時,綁定函數會以創建它時傳入 bind()
方法的第一個參數作為 this
,傳入 bind()
方法的第二個以及以後的參數加上綁定函數運行時本身的參數按照順序作為原函數的參數來調用原函數。
註意:bind
方法的返回值是函數
調用方式
a.bing(thisObj,arg1,arg2...)() 等價於 var fun = a,bind(thisObj,arg1,arg2...); fun();
call apply bind