這三個關鍵字經常看到,但是從來沒有做過詳細的區分。或者說,每次用的時候看一眼,就繼續專注在別的事情上去了。今天整理一下下。
首先,這三個方法的用法十分相似,都是用來改變函數運行時的上下文聯系,其實就是改變this的指向。this引用的是函數執行的環境對象,就是調用this的時候才會去尋找它指向誰。
好,先說apply和call。
兩者用法基本相同,用途是在特定的作用域中調用函數,接收的第一個參數是運行函數的作用域,如果call和apply的第一個參數是null, 那么this就指向了windows。
唯一的不同是apply傳參數會一整個數組傳入,而call則是一個個數值進行傳遞。
舉個栗子呢:
banana.call(this, arg1, arg2);
banana.apply(this, [arg1, arg2]);
banana.apply(this, arguments); //傳入arguments對象
那么當你要傳的參數數量是確定的時候呢,用哪個都可以。
可是如果你有一個數組,但你不知道里面有多少個值,這時候就需要用apply,不可以用call。
apply()和call()的強大還在于能擴充函數運行的作用域,即對象和方法不需要有耦合關系。
那么bind呢,是創建了一個新函數,this值會被綁定到傳給bind()函數的值
window.a = 1;
var obj = { a: 2};
function sayA() {alert(this.a);}
var newA = sayA.bind(o);
newA(); //2
不知道大家喜不喜歡看很多例子,我是有點懶得看一些長篇大論的。。這篇總結就簡短的寫在這里啦
參考:
http://www.admin10000.com/document/6711.html