2009-12-06 73 views
1
Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 
    return function(){ 
     return fn.apply(object, 
      **args.concat(Array.prototype.slice.call(arguments))**); 
    }; 
}; 

此函數在Prototype中。它等於:原型「綁定」方法問題

Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift(); 
    return function(){ 
     return fn.apply(object,**args**); 
    }; 
}; 

在我看來,args.concat(Array.prototype.slice.call(arguments)) == args,因爲匿名 功能沒有任何參數。有什麼事?

回答

4

不,它們不一樣。

級聯參數的裏邊反目的是提供partially apply(或curry)的功能的方式,填充前參數當使用bind並能增加更多的後面時bind返回使用的功能,例如:

var obj = { 
    fx: function() { 
    alert(Array.prototype.join.call(arguments, ', ')); 
    } 
}; 

var fx2 = obj.fx.bind(obj, 1, 2, 3); 
fx2(4, 5); // Alerts "1, 2, 3, 4, 5" 

正如你可以在代碼的最後兩行看到的,當我宣佈fx2,我傳遞obj作爲第一個參數(這將確保的背景下,作爲object變量上bind實施),然後我傳遞值1,23

這些值存儲在bind的外部閉包的args變量中,然後如bind實現中所示,返回另一個函數。

在我的例子中返回的函數是fx2,在最後一行你看到我調用該函數,傳遞兩個額外的參數。

最後調用bind123)和參數時,當函數實際執行(45)返回的函數將調用obj.fx與兩個參數列表中,我們的參數預先填充。

這就是爲什麼有意義連接兩個參數對象。

1

匿名函數沒有任何參數

匿名功能可以實際上有參數(如可在bind方法本身,這也沒有聲明任何參數)。

JavaScript中的類型檢查是不存在的:您可以傳遞比function(...)簽名中聲明的參數更少的參數(在這種情況下,未傳遞的參數將作爲undefined接收),並且您可以傳遞多於聲明,在這種情況下,讀取它們的唯一方法是通過arguments數組,該數組始終包含確切地傳入了多少個參數,而不管函數簽名中的內容如何。

在簽名(function(x, /* y, ... */))中添加註釋以表明將使用arguments數組讀取更多參數通常被認爲是禮貌的。