JS基础(五)

165 阅读2分钟

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('+')));
          }
    }

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

3.组合函数

组合函数即由若干个函数组合成一个新的函数,同时完成数据的传递

例如:


const fn = compose(fn1, fn2)

fn(x)

等价于

fn2(fn1(x))

来让我们简单实现一下

const compose = (...funcs) => {
  return (x) => {
    if (funcs.length === 0) return x
    return funcs.reduceRight((res, item) => {
      return item(res)
    }, x)
  }
}