为什么这个JavaScript闭包数组保留旧值

为什么这个JavaScript闭包数组保留旧值,javascript,arrays,arguments,closures,Javascript,Arrays,Arguments,Closures,我遇到了一个关于java脚本闭包和数组的有趣情况。 我不确定javascript的哪一部分导致了参数数组的缓存 var SLICE=Array.prototype.SLICE; var attach=函数(方法){ var args=SLICE.call(参数,1); 返回函数(){ args=args.concat(SLICE.call(参数,0)); 方法。应用(null,args); }; }; 函数foo(param1、param2、param3){ console.log(param

我遇到了一个关于java脚本闭包和数组的有趣情况。 我不确定javascript的哪一部分导致了参数数组的缓存

var SLICE=Array.prototype.SLICE;
var attach=函数(方法){
var args=SLICE.call(参数,1);
返回函数(){
args=args.concat(SLICE.call(参数,0));
方法。应用(null,args);
};
};
函数foo(param1、param2、param3){
console.log(param1、param2、param3);
};
变量条=附加(foo,1,2);
酒吧(3);

酒吧(4)
函数只接受三个参数

function foo(param1, param2, param3) {
而且它只被发送了三次

method(args[0], args[1], args[2]);
但是,
push()
会推送到数组中,因此当您有
[1,2,3,4]
时,只发送前三个,而不发送第四个

函数是否接受了四个参数

var SLICE=Array.prototype.SLICE;
var attach=函数(方法){
var args=SLICE.call(参数,1);
返回函数(){
for(变量输入参数){
args.push(参数[key]);
}
方法(args[0]、args[1]、args[2]、args[3]);
};
};
函数foo(param1、param2、param3、param4){
console.log(param1、param2、param3、param4);
};
变量条=附加(foo,1,2);
酒吧(3);

酒吧(4)除了adeneo的答案之外,您还可以使用它来实现您的
附加
功能:

function attach(method, a, b) {
    return method.bind(method, a, b);
}

function foo(param1, param2, param3) {
    console.log(param1, param2, param3);
};

var bar = attach(foo, 1, 2);
bar(3);
bar(4);
//output is 
// 1 2 3
// 1 2 4

因为
push
变异了
args
@Bergi,删除了push,以便更好地解释正在发生的场景。我明白这是因为参数的关联方式,所以我编辑了代码,以便更好地解释场景。我不想改变foo的结构或者传递给foo的参数的数量it@goku-第二个代码段没有一直添加到数组中的原因是数组没有存储,每次调用内部函数时,它都会获取原始数组
[1,2]
,并向其添加一个值,然后返回该值,它没有存储,所以下次调用该函数时,它只会执行相同的操作,接受
[1,2]
并添加
4
等。非常感谢您的评论,您能将此作为答案发布吗?我会接受它。@goku-当然,我也将此添加到了答案中。