2012-07-04 25 views
0

我看JQuery的微小的Pub/Sub,這看起來是這樣的:o.bind.apply(arguments);

(function($){ 
    var o = $({}); 

    $.subscribe = function() { 
    o.bind.apply(o, arguments); 
    }; 

    ... 

})(jQuery); 

我不明白的是,因爲代碼是調用o.bind,在「本」裏面是綁定無論如何,因此沒有理由使用申請。

換句話說,

o.bind(arguments) 

o.bind.apply(o, arguments) 

這裏應該是相同的應該不是嗎?爲什麼o.bind.apply(o,arguements)?

回答

4

.apply需要一個數組的參數傳遞,所以他們不是一回事。考慮這個:

function foo(a, b, c) { 
    console.log(a); 
    console.log(b); 
    console.log(c); 
} 

foo.apply(null, [1, 2, 3]); 
// Prints: 
// 1 
// 2 
// 3 

foo([1, 2, 3]); 
// Prints: 
// [1,2,3] 
// undefined 
// undefined 

你可能會混淆它與.call,這肯定會是多餘的。

1

bindapply之間的差異。綁定接受參數並應用獲取一個範圍和一個包含參數的數組。

爲了更清楚。這將是相同的:

o.bind(1,2,3); 

o.apply(o, [1,2,3]); 
+0

'o'不是一個函數,所以它沒有'.apply()'方法。如果你正在考慮ECMAScript'.bind()',那麼就像'.apply()'一樣接受一個調用上下文參數,但是像'.call()'這樣的單個參數。 – 2012-07-05 02:01:18

相關問題