2015-06-17 24 views
0

最近我進入了一些調用函數式編程的東西,並且我學習了call(),bind()和apply()..但是我仍然不太明白,因爲我從不使用函數式編程方法在Javascript中。功能函數內的函數

像功能的功能

function checkGreater(limit){ 
    return function(limit, item){ 
     return item > limit; 
    }.bind(this,limit); 

} 

內這聽起來對我來說這使事情變得更加複雜。我們什麼時候需要函數方法中的函數?像上面的示例代碼一樣。

+0

那麼,當你有一個高階函數應該返回一個新的函數,那麼你必須在它內部創建該函數。 –

回答

1

這樣的例子利用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; 
} 

,並將其存儲到greaterThanTenbind的第一個參數稱爲函數的調用上下文,在這個簡單的示例中,由於沒有使用上下文,所以上下文無關緊要,但可以通過使用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提醒我這個陷阱。

+0

在你的工廠,這是指什麼? –

+0

@EltonJamie在最後一個例子中,'.bind()'將'limit'綁定到'this',所以'checkGreater(15)'會返回一個帶有'15'綁定到返回函數'this'的函數。 –

+0

關於將'limit'綁定到'this':這隻能在嚴格模式下才有效。在「鬆散」模式下,'this'的值將被強制轉換爲一個對象,這會導致各種其他問題(主要是關於等式比較的問題)。 –