Javascript关闭范围混乱

时间:2016-06-15 01:48:22

标签: javascript javascript-events

我对封闭表现的范围感到困惑。 我不明白为什么输出只有40。

JS

  function multiply(input) {
      var no = 5;
      function multiply2(mul) {
        mul *= input;
        return no * mul;
      }
      return multiply2;
    }

    var total = multiply(4);
    var result = total(2);
console.log("result :",result);
  

输出

结果:40

3 个答案:

答案 0 :(得分:1)

multiply(4)返回一个函数multiply2,其范围内有两个自由变量:no,其值为5,而input的值为{ {1}}。此行将返回的函数分配给4

total

var total = multiply(4); 调用该函数,为参数total(2)传入2。该函数的定义是两个语句,但它可以简化为一个语句(因为mul是一个局部变量,并且在修改后从不使用,可以安全地删除副作用):{{1} }。传递了mul,其值为return no*mul*input;; mul2是在调用no时创建的自由变量,我们知道它们的设置是什么,因此,在下面的语句中,结果变为input,这是multiply(4)

5*2*4

答案 1 :(得分:0)

输出40是正确的。你的函数乘以4 * 2 = 8然后你乘以8 * 5 = 40.我想如果你没有得到你期望的是因为你乘以4 * 2并使mul = 8所以那么返回的是5 * 8

答案 2 :(得分:0)

这是一种称为currying的函数式编程。抽象实现将是y = f(m) => g(n) => m*n。因此,您对f的输入将被转移到g并返回一个g(n)的函数。然后您对g的输入将返回最终结果。

这可以实现多个级别。即。 y = f(m)=>g(n)=>h(p)=>m*n*p,其中输入值将被传递到下一个函数,直到最终输入。

Here是函数式编程的一些基础知识。 也是一本很棒的书here