2012-02-07 19 views
10

我幾乎沒有啓動JavaScript,我想知道是否有任何天才,可以幫助我逐行了解這一行嗎?任何天才能告訴我這個小代碼是怎麼回事?從JavaScript忍者的祕密

1: Function.prototype.bind = function(){ 
2: var fn = this, 
3:  args = Array.prototype.slice.call(arguments), 
4:  object = args.shift(); 
5: return function(){ 
6: return fn.apply(object, 
7:  args.concat(Array.prototype.slice.call(arguments))); 
8: }; 
9: }; 

我只是初學者,但如果你能教我,那麼你真棒。我知道原型,調用,轉換,適用一點,所以你可以跳過初學者的部分(儘管我認爲你不應該讓其他幾乎沒有進入JS的人可以學習如何)。

注意:我知道有一個有點「類似的代碼」問過類似的問題here,但我請求逐行解釋,他們不是(不重複)(也可以跳過線8 & 9):)

回答

12

這是EcmaScript 5的一個部分實現,EcmaScript 5 bind方法的確如此,它的確做了partial application。它使

myObject.method.bind(myObject, 1, 2)(3, 4) 

相當於

myObject.method(1, 2, 3, 4) 

但它也更方便,因爲你可以做

var m = myObject.method.bind(myObject, 1, 2); 
m(3, 4); 
m(5, 6); 

,而不是

myObject.method(1, 2, 3, 4); 
myObject.method(1, 2, 5, 6); 

尼特:這兩個都沒有完全等同,因爲如果首先撥打​​確實this.method = somethingElse;然後綁定的方法仍然會調用原始的。

進行分解:

Function.prototype.bind = function(){ 

添加到內置函數類型的方法。

var fn = this, 

商店this應是在正常使用中Function以便它能夠封閉內部使用。

args = Array.prototype.slice.call(arguments), 

創建包含參數bind陣列。

object = args.shift(); 

移除從objectargs並將其存儲在第一個參數。稍後應用時,這將用作fnthis值。

return function(){ 

返回充當部分施加的方法的功能。當調用此函數

return fn.apply(object, 

調用函數的.bind傳遞的第一個參數bind作爲this左側。 apply是一種功能的特殊反射方法,它允許使用類似於Python中的*args**kwargs或Java中的...的參數數組調用函數。

args.concat(Array.prototype.slice.call(arguments))); 

通行證作爲參數fn,所述參數bind隨後由參數到閉合。

5

比方說,我們有一個函數

function hi(a, b) { alert('hi! '+(a+b)); } 

定義每個功能的函數(所以你可以使用例如hi.bind()

1: Function.prototype.bind = function(){ 

FN是this,因此原有功能(在我們的示例this = hi

2: var fn = this, 

arguments(函數的參數)是不正常的陣列,所以下面是將其轉換成精確地包含相同的元件arguments

3:  args = Array.prototype.slice.call(arguments), 

移位的ARGS陣列的技術,返回的第一個(其是要調用的函數)

4:  object = args.shift(); 

此功能的情況下返回一個新的功能

5: return function(){ 

apply是一個允許使用給定焦點和參數調用函數的函數。 hi(2,3)等於hi.apply(window, [2,3])

6:  return fn.apply(object, 

的功能將與您傳遞給我們在(其中bind收益)函數的參數來bind和任何其他參數來調用

7:  args.concat(Array.prototype.slice.call(arguments))); 
8:  }; 
9: }; 

所以hi(2,3)等於(hi.bind(window, 2, 3))()等號(hi.bind(window, 2))(3)

相關問題