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传递到回调中。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...