2016-12-03 52 views
1

您好我很困惑这个JavaScript函数:的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。谢谢你能够解释这个函数的人。

回答

1

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

试着一步一步了解该过程。

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

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

    function(b){ 
        return function(c){ 
         return function(d){ 
          return 4 + b /c * d; 
          }; 
         }; 
        }; 
    }; 
    
  3. 然后currying(4)(8)也为 '无功一个' 返回另一个功能:

    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.
+0

如果我做这种方式一个变种=钻营(4)(8)(2)(6)将它导致相同的? – Cham

1

这是一种词法作用域的所谓瓶盖

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

你可以阅读更多关于此这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

1

这是讨好一个非常令人费解的例子 - 主要功能故名。

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

为了给你一些指针:

在行:

var a = currying(4)(8); 

第一函数调用的4参数;该函数调用的结果是另外一个功能,然后将其与8.

最终的参数立即调用,发生的是,线:

return a + b/c * d; 

与值4,8执行2和6分别用于各个变量。

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

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个独立的国家的税率并返回等待量的功能只是一个功能。