Javascript嵌套函数评估

时间:2016-12-03 12:09:23

标签: javascript currying

您好我对这个Javascript函数感到困惑:

var currying = function(a) {
    return function(b){
        return function(c){
            return function(d){
                return a + b /c * d;
                };
            };
        };
    };
var a = currying(4)(8);
var b = a(2)(6);
console.log(b);

它输出28但我不确定Javascript是如何评估该功能的。我也知道a = 4,b = 8,c = 2,最后是d = 6.感谢能够解释这个功能的人。

4 个答案:

答案 0 :(得分:3)

当你使用currying时,你正在编写一个带有一个参数的函数,它将返回一个接受下一个参数的函数,直到提供所有参数。

在这种情况下,你需要调用返回的函数4次,直到你到达最后一个函数并评估所有的参数。

这很好,因为您可以在代码执行期间的不同时间传入参数,并且可以使用已在最终函数的闭包中设置的参数创建新函数。例如

const fourPlusTwo = currying(4)(2)

现在您可以在代码中的任何位置使用新函数fourPlusTwo,并且您将在剩余的两个函数的闭包中创建这些参数。

您拥有的代码是非标准示例,但如果您需要在整个应用中计算税收,则可以执行类似的操作。

const inclusiveTax = rate => amount => {
  return '$' + (amount * (rate / (100 + rate))).toFixed(2)
}

const norwayIncomeTax = inclusiveTax(60.2)
const strayaIncomeTax = inclusiveTax(32.5)
const muricaIncomeTax = inclusiveTax(31.5)

console.log(
  norwayIncomeTax(50000),
  strayaIncomeTax(50000),
  muricaIncomeTax(50000)
)

只使用一个功能,您就可以计算3个不同国家/地区的税率,并返回等待该金额的功能。

答案 1 :(得分:1)

这是一种名为 Closures

的词汇范围

基本上:闭包是函数中的一个函数,可以访问所有父变量和参数。由于javascript中的每个参数都默认通过引用传递,它甚至可以修改父变量,以便稍后执行父函数来查看更改。最好的例子是jquery的ready函数,它包含了所有其他函数。

您可以在此处详细了解:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

答案 2 :(得分:1)

这是 currying 的一个非常复杂的例子 - 因此是主要功能的名称。

Currying起源于函数式编程领域,并且为了完全理解它,我建议你做一些阅读,特别是当它在javascript中实现时。

给你一些指示:

在行中:

var a = currying(4)(8);

第一个函数用参数4调用;该函数调用的结果是另一个函数,然后使用参数8立即调用。

最终,所有发生的事情都是:

return a + b / c * d;
对于每个相应的变量,执行值为4,8,2和6的

应用正常的算术规则给你28的答案(先划分,然后乘法,最后加)。

答案 3 :(得分:1)

你应该知道函数对象和函数调用之间的区别。 像:var a = function(v){return v + 1;} a是一个函数对象。然后a(2)调用函数a。

尝试逐步了解该过程。

  1. currying是一个返回另一个函数的函数。

  2. 所以currying(4)返回一个函数(a给定值为4):

    function(b){
        return function(c){
            return function(d){
                return 4 + b /c * d;
                };
            };
        };
    };
    
  3. 然后currying(4)(8)也是' var a'返回另一个函数:

        function(c){
            return function(d){
                return 4 + 8 /c * d;
                };
            };
        };
    
  4. 调用a(2)返回一个函数对象:

            function(d){
                return 4 + 8 / 2 * d;
                };
            };
    
  5. 最后a(2)(6)返回4 + 8 / 2 * 6,即28。