不需要结尾()的柯里化!!!

43 阅读1分钟

结果图

image.png

柯里化是怎么执行的

首先先让我们来看看需要()回调的柯里化是怎么执行的

image.png

每次我们使用柯里化函数都需要在结尾使用一个(),让其可以返回结果值,但是多多少少有点多余,而我们又无法在执行前去判断一个函数之后是否会被调用,那么,如果是字符串呢?

function test(){
  let a = [...arguments]
  function c(){
      if(arguments.length){
          a.push(...arguments)
          return c;
      }else{
          return a
      }
  }
  return c
}
function _c(evalStr){
    // 去除函数中的() 
    evalStr = evalStr.replaceAll(/\(\)/g,'')
    // 获取函数名
    let fn = evalStr.split('(')[0]
    // 获取函数执行体 例:(1)(2)
    let fnCall = evalStr.split(fn)[1]
    let executeStr = fn+fnCall+'()'
    // eval是浏览器内置的一个js执行函数,整活可以试试,项目里面根据情况去使用,有一定的注入风险
    return eval(executeStr)
}
console.log(_c('test(1,2,3)()(4)')) //  [1, 2, 3, 4]
console.log(_c('test(1,2)(5)()'))   //  [1, 2, 5]
console.log(_c('test()()(1,2)(5)(6)'))//  [1, 2, 5, 6]

免责声明

此次使用的 eval 是整活用的,请各位尽量不要在公司现目使用,有注入风险!!!,若要使用请做好闭包之类的处理

image.png