2013-07-21 77 views
0

下面的一段代碼(從MSDN)是一個簡單的實現「綁定」功能:使用數組原型切片呼叫

/* Approximation of `Function.prototype.bind` from ES5 (without error checking) */ 
Function.prototype.bind = function(thisArg) { 
    var fn = this, args = *Array.prototype.slice.call(arguments, 1)*; 
    return function() { 
    return fn.apply(thisArg, args.concat(*Array.prototype.slice.call(arguments, 0)*)); 
    }; 
}; 

誰能解釋第一次調用Array.prototype.slice.call?我知道參數不是數組,需要在使用slice和concat之前將它變成數組。我不明白第一個電話 - 是不是我們在撥打電話時丟失了第一個元素

Array.prototype.slice.call(arguments, 1)? 

回答

0

你是對的。

arguments的第零個元素是thisArg,這就是它被刪除的原因。

0

根據關於bind的文檔,第一個參數(arguments[0])要被用作由bind(以下簡稱「綁定函數」)返回的函數內的this值的客戶this值。

接下來(arguments[1] - arguments[n])有觀點認爲是調用綁定功能時,前置,除了論點提供了一個名爲時說。

什麼第一Array.prototype.slice.call確實是切片傳給bind調用的參數,並得到通過的第二個參數開始預先考慮的參數,使這將是我們的this第一個參數後面。

例如

var newFN = someFunction.bind(myNewThis,foo,bar,baz); 

第一Array.prototype.slice.call需要foobarbaz

在返回的功能,foobarbaz獲得預先考慮調用綁定函數時提供的參數:

//fn - original function 
//args - extracted arguments foo, bar and baz 
//thisArg - the provided `this` value, myNewThis 

//this code basically: 
// - calls the original function (fn) 
// - provides a custom `this` value (thisArg) 
// - provides arguments that comprise the extracted arguments + the passed arguments 
fn.apply(thisArg, args.concat(Array.prototype.slice.call(arguments, 0))); 

因此,當您使用新的「綁定」功能,你會得到一個定製this值,以及一個「預設」,前置參數列表:

newFN('ban','bam'); //arguments === ['foo','bar','baz','ban','bam']; 
+0

確定澄清了一下。然而,爲什麼需要用fn.apply中的參數來連接參數?我會認爲一旦我們創建了我們的args變量,我們就會通過它來應用。 –

+0

@Joel_Blum我在最後一部分和代碼中解釋了它。 – Joseph