2016-04-14 29 views
2

從綁定返回值和通過函數()創建等價物的結果之間有什麼區別?有沒有什麼有效的區別? (我沒有詢問bind的上下文保留屬性)。有什麼技術/性能的原因,你可能會喜歡一種方法。從綁定返回和使用函數的結果之間有什麼區別()

var myFunc = foo.bind(undefined, bar); 

VS

var myFunc = function() { foo.call(undefined, bar) }; 

回答

2

是否有任何有效的區別?

有什麼技術/性能的原因,你可能更喜歡一個 方法。

第二個版本包含一個額外的函數調用。

+0

由於bind的返回值是一個函數,是否真的有一個額外的fu nction電話?對於不支持本地支持的瀏覽器的綁定的大量實現是根據函數完成的() – Tibrogargan

+0

@Tibrogargan包裝'foo.call(undefined,bar)'的引用函數' – guest271314

+0

在不支持它的瀏覽器中,綁定被實現爲(解釋)'bind(thisObj,...){return function(){foo.call(thisObj,...); '',所以在這些情況下*沒有[有效]差異*。這對支持它的瀏覽器也是這種情況嗎? – Tibrogargan

0

#bind不IE8工作。因此,在這種情況下,你可以使用你的第二個例子=),但它會更好地執行#bindhere

1

沒有技術上的差異,但有一個性能和無錯誤的區別。 function.prototype中的所有函數都是由一些最好的開發人員編寫的,以遵循所有程序員期望的特定規範。當然,測試得很好。

最好不要重新發明輪子,總是這樣的,開發人員將會做得比我們以往做得更好。

注1:I8 now is below 0.3 % of usage,所以不介意它是否不支持綁定。有很多機會在您的網站上不支持許多事情。

注2:在鍍鉻結合的實現是這樣的:

寫在DEV-控制檯鉻:Function.prototype.bind ,你得到的結果,這

function(e,t){var n=this;return null!=t&&(t=Array.from(t)),function(){return n.apply(e,t||arguments)}} 

獎勵:這裏是一個非常相似執行更乾淨的代碼(複製Prototype.js中的.bind方法):

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))); 
    }; 
}; 
+0

感謝您的回答。我認爲guest271314的答案更接近標準。技術上的差異 - 使用綁定對於相同的結果會比較慢(有些人可能會認爲它更易於維護)。代碼可能由偉大的開發人員編寫,但您使用它並沒有獲得任何好處。 – Tibrogargan

+0

這個東西沒有意義。程序的速度與算法有關,如果綁定做0.1ms或0,2ms,沒有人會理解不同的情況,但只有在使用重複這麼多次的算法時纔會有所不同。如果你想做一個如此時間複雜(大o)算法不使用JavaScript,請在​​服務器中執行此操作,並確保使用最佳算法。你也是。 –

相關問題