如何通过Function.prototype.apply()更改调用函数的参数?

时间:2016-05-05 02:14:48

标签: javascript function arguments apply

function foo1(a,b){
   console.log(arguments); //["oldValue","oldValue"]

   var newArguments = foo2.apply(this,arguments);
   for (var i=0;i<arguments.length;i++){
      arguments[i] = newArguments[i];   
}
   console.log(arguments); //["newValue","newValue"]
}

function foo2(){
   arguments[0] = "newValue";
   arguments[1] = "newValue";
   console.log(arguments); //["newValue","newValue"]
   return arguments;
}

foo1("oldValue","oldValue");

我想通过外部函数foo2更改foo1参数值。我是通过在foo2中使用新参数返回数组并用foo1中的返回数组替换foo1参数来实现的。还有其他 - 更优雅的方式吗?

3 个答案:

答案 0 :(得分:0)

为什么不直接收到arguments

function foo1() {
  console.log('foo1', arguments); // foo1 { '0': 'oldValue', '1': 'oldValue' }

  arguments = foo2.apply(this, arguments); 

  console.log('foo1', arguments); // foo1 { '0': 'newValue', '1': 'newValue' }

}

function foo2() {
  arguments[0] = 'newValue';
  arguments[1] = 'newValue';
  console.log('foo2', arguments); // foo2 { '0': 'newValue', '1': 'newValue' }
  return arguments;
}

foo1('oldValue', 'oldValue');

<小时/> 更新1

由于您还要更改ab,我会再次尝试拨打foo1“,如下所示:

function foo1(a, b) {
  console.log('foo1', arguments);

  if (a === 'oldValue') // Detect if `arguments` has been changed or not. 
                        // (You can also use a variable to record the change if you prefer.)
    // If not, change the arguments and call `foo1` using the new arguments
    return foo1.apply(this, foo2.apply(this, arguments));

  console.log('foo1 (after changed)', arguments , a, b);
  // Do something you want to do originally in `foo1`
}

我想你可以创建一个新函数而不是更改foo1中的参数,因为它对我来说似乎有点棘手?

答案 1 :(得分:0)

https://jsbin.com/jibodu/1/edit?js,console

如果你从x返回两个新参数,只需将参数设置为该返回值:

foo2

完整代码:

arguments = foo2();

答案 2 :(得分:0)

好的,我找到了解决方案。我刚刚将apply()中的第一个参数更改为&#34;参数&#34;。现在它指的是呼叫者功能的参数,并通过“这个”#39;我可以直接改变它的价值观。尽管如此,感谢您的支持!

function foo1(a, b) {
   foo2.apply(arguments,arguments);
   console.log(arguments);  //["newValue","newValue"]
   console.log(a); //"newValue"
}
function foo2() {
   this[0] = "newValue";
   this[1] = "newValue";
};
foo1("oldValue","oldValue");