这样的例子利用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提醒我这个陷阱。
那么,当你有一个高阶函数应该返回一个新的函数,那么你必须在它内部创建该函数。 –