函数调用会默认调用toString方法?

1,488 阅读1分钟

带着问题去思考,等看到答案的时候,一脸楞逼,怀疑人生。

请实现一个 add 函数,满足一下功能

add(1);       // 1
add(1)(2);    // 3
add(1)(2)(3);// 6
add(1)(2, 3); // 6
add(1, 2)(3); // 6
add(1, 2, 3); // 6

咋一看,这不就是柯里化么,延迟计算,很明显,带上狗脑子,拿起笔就上,然后。

然后我发现,柯里化要实现这个,不应该是这样 add(1)(2)(3)() 调用的吗?冥思苦想。

后来发现了,函数调用的时候,会默认调用 toStringvalueOf 方法,所以是可以解决 add(1)(2)(3) 问题的,于是,兴冲冲拿起笔继续上。

function add(){
  let args = [...arguments];
  let _add = function(){
    args.push(...arguments);
    return _add;
  }
  _add.toString = function(){
    return args.reduce((acc, cur) => acc + cur);
  }
  return addfun;
}

好,是时候调试了。

{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }
{ [Function: addfun] toString: [Function] }

???

Node 环境下运行 js ,一脸楞逼。

然后在浏览器的环境下

f 1
f 3
f 6
f 6
f 6
f 6

好像没毛病。。。

console.log 的结果是有点怪异哦,也不知道这个问题是不是算是已经被解决了。

好了,珍惜我的头发,留待有缘人,不吝指教。