JS基础(五)

我心飞翔 分类:javascript

JS基础知识5

关于闭包的一些进阶

1.惰性函数

所谓惰性函数就是有些条件能执行一次就执行一次,绝不执行多次

   var time = null
   var fn = function() {
       if (!time) {
           return time = 2
       } else {
           return time += 1
       }
   }
   
   fn()
   fn()
   fn()
 

我们会发现其实在第一次执行这个函数的时候,time的值就不再是null了,但是后面的调用我们依然会去判断time的值是否存在,这就感觉很"勤快",为了懒一点我们改造一下:

   var time = null
   var fn = function() {
      time = 2
      fn = function() {
          time += 1
      }
      return time
   }
   
   fn()
   fn()
   fn()
 

像这样我们在第一次执行完后,就把函数给改了,以后再也不用在担心要多做一个判断了

2.柯理化函数

柯理化函数是啥呢?百度百科这么说:柯理化函数是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

简单举个例子:

   function add(a, b) {
       return a + b
   }
   
   console.log(add(1,2))
   
   function addCurry(a) {
       return function(b) {
           return a + b
       }
   }
   
   console.log(addCurry(1)(2))
 

这就是把复杂变简单,通俗的讲,一道很难的数学题,一般会给好几问,而下一问的求解通常会用到上一问算出的结果。这种渐进式的解题方法会大大提高解题的速度和难度。而柯理化就是这一思想,将复杂的问题拆分成一个个小问题,进而来求解。

而关于柯理化又到金典的面试题:

let res = fn(1, 2)(3)
// 使 res 的结果等于6

这里虽然是最多只有两个参数,但是我们可以拓展成多参的形式,解面试题不都是这样,不光要对,还要通用型

    function fn() {
         let arg = Array.from(arguments)
         return function() {
             let arg1 = Array.from(arguments)
             let arr = arg.concat(arg1)
             console.log(arr.reduce((result, item, index)=> {
               return result + item
             }))
            // console.log(eval(arr.join('+')));
          }
    }
 

至于柯理化函数的意义,就不展开了,有兴趣可以知乎一下

回复

我来回复
  • 暂无回复内容