为了好玩,我正在寻找一种创建函数array
的方法,具有以下行为:
array() // []
array(2) // ugly function thing
array(2)() // [2]
array(2)(3)() // [2,3] etc
我最接近的是
function array(x) {
if (x == null)
return []
return function() {
// same as above?!
// I don't want some inelegant solution involving a lot of additional parameters
}
}
有没有办法在ECMA5中执行此操作?如果没有,请证明语法不能适应这样的功能。
答案 0 :(得分:2)
是," 与上述相同"。这可以通过"递归" 1 调用来解决:
function makeArrayAppender(arr) {
return function array() {
var args = Array.prototype.slice.call(arguments);
if (!args.length)
return arr;
else
return makeArrayAppender(arr.concat(args));
};
}
var array = makeArrayAppender([]);
1:从返回的" thunk"中调用该函数。功能,而不是来自呼叫本身,它不是真正的递归。它更像是一个尾调用优化函数,可以在不填充堆栈的情况下手动调用
答案 1 :(得分:-1)
我认为这应该完全符合您的要求。自执行函数的范围是r
和rr
,它们基本上是使用此实现的静态变量。当然,您需要在将r
分配给rr
后重置ra
,这样您就可以在undefined
具有var array = (function(){
var r = [], rr;
function ra(a){
if(a === undefined){
rr = r; r = []
return rr;
}
else{
r.push(a);
return ra;
}
}
return ra;
})();
console.log(array()); console.log(array(5)()); console.log(array());
console.log(array(7)(2)());
参数时返回数组,然后停止递归行为。
{{1}}