Javascript 有没有办法以编程方式向函数添加新参数?

Javascript 有没有办法以编程方式向函数添加新参数?,javascript,Javascript,由于我可以通过调用函数的function.length属性来确定函数期望拥有的参数数量,因此我是否可以通过编程方式创建正确数量的参数,以便在运行时插入该函数?例如: var xyz = function(a,b) {}; var bcd = function(a,b,c,d,e,f) { }; // vararg example var doc = document, func_length = xyz.length; doc.xyz = (function() { return fun

由于我可以通过调用函数的
function.length
属性来确定函数期望拥有的参数数量,因此我是否可以通过编程方式创建正确数量的参数,以便在运行时插入该函数?例如:

var xyz = function(a,b) {};
var bcd = function(a,b,c,d,e,f) { }; // vararg example
var doc = document, func_length = xyz.length;
doc.xyz = (function() {

   return function(a,b,c,d,e) { /* works for one but not the other */ } }).call(doc);

   /* would prefer to `return function(a,b)` with only 2 parameters, if it is
   used for function `xyz` (though returning 5 works fine in this case), and to
   `return function(a,b,c,d,e,f)` with 6 if used for function `bcd` (which does
   not work with only five params). */

   // thinking about xyz.apply(null,arguments)...but which arguments..? :(

   // Returning function(a,b,c,d,e) does not support functions with more than five 
   // parameters...which would mostly be varargs - hence my question

   // I am also well aware that I can use an object or an array instead of
   // using many params.

   /* This is for incorporating a user-defined function for use in my code, while 
    * allowing for my function to do 'other stuff' afterward. (And allowing for 
    * varargs, of course).
    * Because coding something like: doc.xyz = xyz is inflexible */

正如你所看到的,我不知道如何做到这一点,或者这是否可能。搜索栏没有给我任何其他类似的问题,否则我不会问…

如果您将两个参数6和7发送到
函数doWork(a、b、c、d、e),a=7和b=6将自动设置,其余参数将被忽略

NOTE: This answer is a product of misunderstanding but
      may help the future visitors of this site.
另一种方式: 您真的需要添加参数吗?这样编写函数就足够了:

function foo(){ //No arguments predefined
 a = arguments[0] || ""; //first argument or (if not defined) empty string
 b = arguments[1] || ""; //second argument etc.
 c = arguments[2] || ""; //third argument etc.
 alert(a+b+c);
}
foo("Hello ", "world!");
这会提醒“你好,世界”



您想要的解决方案: 最简单的方法是: 这是您所要求的,但它不像以前的解决方案那么简单。
您可以定义一个包含所有参数的元函数和一个随时间变化的处理函数

(function(){ //Wrapper

  var foo_meta = function(a,b,c,d){ //Local meta of foo
   alert(a+b+c+d); //Do the code
  };

  window.foo = function(a,b){ //Global foo
   return foo_meta(a,b,"","");
  };

  window.redefine_foo = function(){ //Global foo-changer
   //Rewrites foo
   window.foo = function(a,b,c){
    return foo_meta(a,b,c,"");
   };
  };

})(); //Wrapper

//Do some code
foo("a","b");

redefine_foo(); //Rewrite foo

foo("a","b","c");

//Note that foo_meta is not defined here
foo_meta == undefined; //It's safe in the wrapper :)
这将向“ab”和“abc”发出警报。有关包装器函数的含义,请参阅参考资料



参考: 参数数组:

包装代码:

嗯,我想我终于明白了。我已经意识到,可能没有办法像我所要求的那样“真正地”向函数中添加参数,但有一种方法可以模拟相同的结果:

var doc = document;
var xyz = function(a,b) {};
var bcd = function(a,b,c,d,e,f) {};
var obj = {};

// Now, here it is (mostly (sort of)):

obj.userFunc = function(args) { 

var args_Array = [];

for (var i=0;i < arguments.length; i++ ) { 
    args_Array.push(arguments[i]) 
}
xyz.apply(null,args_Array); // or 'this'. or 'undefined'. Whatever you want.

// do other stuff

return this; // we know what to do to make 'this' scope explicit

} // end

var thisFunc = 'xyz'
doc[thisFunc] = obj.userFunc;
doc.xyz('h','i');
doc.xyz('h','i','j');
doc.xyz('h','i','j','k'); 
doc.xyz('h','i').xyz('j','l').xyz('j','q'); // etc.
var doc=单据;
var xyz=函数(a,b){};
var bcd=函数(a,b,c,d,e,f){};
var obj={};
//现在,它在这里(主要是(某种程度上)):
obj.userFunc=函数(args){
变量args_数组=[];
对于(var i=0;i
诀窍是使用
参数
对象,它方便地将所有参数吸收到一个现成的对象中,将每个值推到一个数组中,然后
应用该函数

如果你想知道这到底是怎么回事,我想把一个用户定义的函数完全合并到另一个函数中,而之后仍然可以做“其他事情”。我前面的示例在一定程度上有效,但不支持varargs。确实如此

这种方法比:
doc[thisFunc]=userDefinedFunction


:)2014年4月26日

这是一个连接参数的示例,无论参数的数量如何,都可以显示如何将函数参数转换为数组,然后像任何其他数组一样进行处理

function foo(){ //No arguments predefined
  // convert to real array
  var args = Array.prototype.slice.call(arguments);
  // or if Array generics are available
  var args = Array.slice(arguments);
  console.log(args.join(' '));
}

foo('Hello', 'world!');
foo('Hello', 'wonderful', 'world!');
这是你的电话号码


Ref:

为什么不将一个对象传递到函数中并使用JQuery extend呢

e、 g


只需忽略一个事实,即您有5个参数,并传递两个参数。如果您输入的参数少于或多于所需的数量,JavaScript不会抛出,除非您在这种情况下专门抛出函数。另外,在你的第一个例子中,它是用来创建全局函数的吗?@OneKitten对不起,我的错。所以你的目标是让一个函数做一些事情,然后将所有参数传递给另一个函数?嗯……我目前对
$的工作原理几乎一无所知。extend
真正的工作原理-必须检查一下。
var parm = 

{  x: 1, y : 2};

f(p) {
   p = $_.extend({...defaults here}, p);
...

}