最近我开始调用函数式编程,我学习了call(),bind()和apply()..但我仍然不太明白因为我从未在Javascript中使用函数式编程方法。
类似函数中的函数
function checkGreater(limit){
return function(limit, item){
return item > limit;
}.bind(this,limit);
}
听起来它让事情变得更复杂。我们何时需要函数方法中的函数?像上面的示例代码。
答案 0 :(得分:1)
这样的示例利用JavaScript的闭包来实现所谓的" factory"。 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提醒我这个陷阱。