如何解决JavaScript回调和功能编程
| “功能编程仅描述要在程序输入上执行的操作,而不使用临时变量来存储中间结果。” 问题是如何应用函数式编程,又如何使用利用回调的异步模块。 在某些情况下,您希望回调函数访问一个变量,该变量将调用异步引用的函数构成,但是已经定义了回调函数的签名。 例:function printSum(file,a){
//var fs =....
var c = a+b;
fs.readFile(file,function cb(err,result){
print(a+result);///but wait,I can\'t access a......
});
}
当然我可以访问a,但这将违反纯函数式编程范例
解决方法
fs.readFile(file,(function cb(err,result){
print(this.a+result);
}).bind({a: a});
如有必要,只需将带有变量和作用域的“ 2”注入到函数中。
因为您抱怨API
fs.readFile(file,(function cb(a,err,result){
print(a+result);
}).bind(null,a);
叫做咖喱。这是更多的FP。
, 我认为问题在于您误解了使用中间值的含义(或者他们误解了它,我没有阅读链接)。考虑功能语言中的变量是某物的“ 4”,并且定义不能更改。只要名称不更改,就可以在函数式编程中为名称/公式使用名称。
function calculate(a,b,c) {
// here we define an name to (a+b) so that we can use it later
// there\'s nothing wrong with this \"functionally\",since we don\'t
// change it\'s definition later
d = a + b;
return c * d;
}
另一方面,从功能上讲,以下操作不可行
function sum(listofvalues) {
sum = 0;
foreach value in listofvalues
// this is bad,since we\'re re-defining \"sum\"
sum += value;
return sum
}
为了更接近代码中的内容,请考虑您有一个函数调用ѭ7
, function printSum(file,a) {
//var fs =....
var c = a + b;
fs.readFile(file,function cb(err,result,aa = a) {
print(aa + result);
});
}
如今,使用默认参数,可以将a传递到回调中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。