函数方法中的函数
function within a function approach
最近我遇到了函数式编程,我学习了call(),bind()和apply()。但我仍然不太明白,因为我从不在 Javascript 中使用函数式编程方法。
喜欢函数中的函数
function checkGreater(limit){
return function(limit, item){
return item > limit;
}.bind(this,limit);
}
在我看来,这让事情变得更加复杂。我们什么时候需要函数方法中的函数?就像上面的示例代码一样。
像这样的例子利用了JavaScript的闭包来实现所谓的"工厂"。这是一篇关于MDN的文章,讨论了关闭和工厂。
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);
}
这与上面的示例完全相同,只是工厂使用内部函数的调用上下文来设置限制。
请注意,在严格模式下,这将完全按预期工作。但是,在"松散"模式下,this
将被强制new Number(limit)
这不是原始值,不能使用严格相等运算符===
进行比较。谢谢@FelixKling提醒我这个陷阱。
相关文章:
- 如何确保函数/方法参数为certian类型
- Javascript中对象中的函数方法
- Object.assign(),函数方法和内存使用
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 如何使用 Karma、Jasmine 和 Istanbul 指定测试应涵盖哪些函数/方法
- 在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的
- 如何调用通过它传递不同 ID 的函数方法
- Sencha ExtJs 为什么从“构造函数”方法返回“this”
- 这个 JavaScript 函数方法调用了什么
- 如何在 javascript 中从子原型调用父类的构造函数方法
- 是否仍可访问被覆盖的函数/方法
- 在构造函数之外更改 JavaScript 中的构造函数方法
- 这种实例化构造函数方法的风格是什么
- 如何在 JavaScript 中使用继承与构造函数方法一起使用 返回具有私有属性的对象文本
- 我的javascript构造函数方法以文本形式返回整个方法,而不是预期的返回值
- 如何在事件中将变量传递给构造函数方法
- 如何限制用户在ui ace编辑器中只能编写一个javascript函数(方法)
- 打印任何java应用程序的函数/方法调用序列
- 如何在jQuery语句中使用Javascript构造函数方法