這樣的例子利用JavaScript的閉包來實現所謂的「工廠」。 Here's an article on MDN that discusses closures and factories。
function checkGreater(limit) {
return function(limit, item) {
return item > limit;
}.bind(this, limit);
}
在這個例子中,這是一個工廠,返回一個可以傳遞參數並檢查傳入的參數是否比傳遞到工廠限值的功能。下面是使用例子:
var greaterThanTen = checkGreater(10);
這將返回:
function (10, item) {
return item > 10;
}
,並將其存儲到greaterThanTen
。 bind
的第一個參數稱爲函數的調用上下文,在這個簡單的示例中,由於沒有使用上下文,所以上下文無關緊要,但可以通過使用this
關鍵字在函數內引用。
然後你可以使用greaterThanTen
這樣的:
if (greaterThanTen(5)) {
console.log('5 is greater than 10'); // never gets called
}
if (greaterThanTen(11)) {
console.log('11 is greater than 10'); // this gets called
}
如果我不過寫我自己的工廠要做到這一點,我可能會寫它像這樣:
function checkGreater(limit) {
return function(item) {
return item > this;
}.bind(limit);
}
這確實與上面的例子完全相同,除了工廠使用內部函數的調用上下文來設置限制。
請注意,在strict mode這將完全按預期工作。但是,在「寬鬆」模式下,this
將被強制爲new Number(limit)
,這不是原始值,不能使用嚴格相等運算符===
進行比較。謝謝@FelixKling提醒我這個陷阱。
那麼,當你有一個高階函數應該返回一個新的函數,那麼你必須在它內部創建該函數。 –