2012-04-05 153 views
3

如何传递一个函数的所有参数到另一个将一个函数的所有参数传递给另一个函数?

function a(){ 
    arguments.length;// this is 1 
    // how do I pass any parameter function a receives into another function 
    b(what to put here?); // say pass all parameters function a receives to function b 
} 
a('asdf'); // this is okay 

因此,如果功能的接收参数X号(JavaScript)的,每一个参数,然后传递到函数b以相同的顺序。所以如果一个(“1”,“2”); ,b(“1”,“2”);如果a(“1”,2,[3]); ,b(“1”,2,[3]);.

回答

5

使用Function.prototype. apply(thisArg[, argsArray]),像这样:

b.apply(this, arguments); 

现在,arguments是具有一些其它性质类似阵列的对象(如callee)除了其正索引属性。因此,您可能应该使用Array.prototype. slice()将对象转换为一个简单的参数数组(尽管两者都可以在现代环境中使用)。

b.apply(this, Array.prototype.slice.call(arguments)); 

参见:Function.prototype. call()

2

为什么不将它们作为一个单独的对象?使用单个对象作为参数的优点是,

  • 订单是没有必要的。不像其他论据,你必须知道它是接收集合中的第一,第二,第三,在对象中,它们就在那里。在你需要时给他们打电话。
  • 你从不担心有多少人通过。您可以发送一个对象包含很多的属性 - 你只能通过主叫方和被叫方

ofcourse之间的一个说法,你必须使用

function foo(data){ 
    data.param1; //is foo 
    data.param2; //is bar 
    data.param3; //is baz 

    //send params to bar 
    bar(data); 
} 

function bar(info){ 
    info.param1; //is foo 
    info.param2; //is bar 
    info.param3; //is baz 
} 

//call function foo and pass object with parameters 
foo({ 
    param1 : 'foo', 
    param2 : 'bar', 
    param3 : 'baz' 
}) 
+0

当相同的功能之前对它们进行测试,如果他们存在是由浏览器JavaScript内部提供的,那么为什么又要担心。此外,可以使用切片和拼接功能进行更改:http://stackoverflow.com/questions/3914557/passing-arguments-forward-to-another-javascript-function – iMatoria 2012-09-27 02:51:55

+0

我认为命名参数是一种更好的范例,但是在JavaScript中,内置的方式是编号的,至少在ES5中是这样。因此,仅仅简单地传输参数而不是打包和解包对象会更直观。当然,有些情况可能需要对象技术。 – Beejor 2015-11-11 23:36:02

+0

@Beejor,我相信这在2012年得到了回复,并且已经选择了一个更好的答案。 – Joseph 2015-11-12 00:30:52

相关问题