javascript 中的尾函数
Tail function in javascript
我想制作一个添加参数的函数。调用这个函数应该是
functionAdd(2)(3)(4)...(n);
结果为 2+3+4...+n
我正在尝试这个
function myfunction(num){
var summ =+ num;
if(num !== undefined){
return myfunction(summ);
}
};
但是不行,ovwerflow的错误。而且我不明白我应该从这个功能中退出什么地方;
您可以使用 .valueOf
来解决这个问题:
function myfunction(sum){
var accum = function(val) {
sum += val;
return accum;
};
accum.valueOf = function() {
return sum;
};
return accum(0);
};
var total = myfunction(1)(2)(3)(4);
console.log(total); // 10
JSFiddle:http://jsfiddle.net/vdkwhxrL/
工作原理:
在每次迭代中,您 return 对累加器函数的引用。但是当您请求结果时 - .valueOf()
被调用,return 是一个标量值。
请注意,结果仍然是一个函数。最重要的是,这意味着它不会在分配时被复制:
var copy = total
var trueCopy = +total // explicit conversion to number
console.log(copy) // 10 ; so far so good
console.log(typeof copy) // function
console.log(trueCopy) // 10
console.log(typeof trueCopy) // number
console.log(total(5)) // 15
console.log(copy) // 15 too!
console.log(trueCopy) // 10
如果最后一次调用可以不带参数:
function add(value) {
var sum = value;
return function add(value) {
if(typeof value === 'number') {
sum += value
return add
} else {
return sum
}
}
}
console.log(add(1)(2)(3)(0)()) // 6
我想制作一个添加参数的函数。调用这个函数应该是
functionAdd(2)(3)(4)...(n);
结果为 2+3+4...+n 我正在尝试这个
function myfunction(num){
var summ =+ num;
if(num !== undefined){
return myfunction(summ);
}
};
但是不行,ovwerflow的错误。而且我不明白我应该从这个功能中退出什么地方;
您可以使用 .valueOf
来解决这个问题:
function myfunction(sum){
var accum = function(val) {
sum += val;
return accum;
};
accum.valueOf = function() {
return sum;
};
return accum(0);
};
var total = myfunction(1)(2)(3)(4);
console.log(total); // 10
JSFiddle:http://jsfiddle.net/vdkwhxrL/
工作原理:
在每次迭代中,您 return 对累加器函数的引用。但是当您请求结果时 - .valueOf()
被调用,return 是一个标量值。
请注意,结果仍然是一个函数。最重要的是,这意味着它不会在分配时被复制:
var copy = total
var trueCopy = +total // explicit conversion to number
console.log(copy) // 10 ; so far so good
console.log(typeof copy) // function
console.log(trueCopy) // 10
console.log(typeof trueCopy) // number
console.log(total(5)) // 15
console.log(copy) // 15 too!
console.log(trueCopy) // 10
如果最后一次调用可以不带参数:
function add(value) {
var sum = value;
return function add(value) {
if(typeof value === 'number') {
sum += value
return add
} else {
return sum
}
}
}
console.log(add(1)(2)(3)(0)()) // 6