被一道面试题目难到了。
有函数multi(2)(3)(4)=24,算法是2X3X4=24。
求解multi函数。
求大神解答~
------------------分割线---------------------
最终采纳了@Ende93 的答案,感觉更优美一些。但是代码需要调整一下:
function multi(n){
var fn = function(x) {
return multi(n * x);
};
fn.toString = function() {
return n;
};
return fn;
}
demo: http://jsfiddle.net/etianqq/7sjo4nwt/
------------------分割线---------------------
谢谢 @kikong 的comments,我之前想法是仓促些,之所以demo里面显示为24,是因为dom操作时自动调用了function.toString(),所以显示为数字了。
如果直接console.log(multi(2)(3)(4))--->function... ,如果是console.log(multi(2)(3)(4)+1)--->25.
所以,上面的方案还是有所欠缺的。
黄舟2017-04-10 16:32:38
看了各位大神的解答后,感觉很受启发。我试着写了一个科里化函数:
var curry = function(func) {
var that=this;
var curry_func = function() {
var this_func = arguments.callee;
var new_params = this_func.params.slice();
for(var i=0;i<arguments.length;i++)
new_params.push(arguments[i]);
if(new_params.length >= func.length)
return func.apply(that, new_params);
else{
// dirty way to copy function
eval('var new_func =' + this_func.toString());
new_func.params = new_params;
return new_func;
}
};
curry_func.params = [];
return curry_func;
};
// 原函数
var test_func = function(a, b, c) { return a*b*c; };
var f0 = curry(test_func);
// 实现科里化功能
console.log(f0(2,3,4));
console.log(f0(2)(3)(4));
console.log(f0(2,3)(4));
// 科里化结果不会互相影响
f1 = f0(2,3);
console.log(f1(10));
console.log(f1(11));