如何将JS函数数组传递给另一个JS函数?

3

我是一个Java脚本的新手。我正在编写一些异步函数,比如func1, func2, func3。但它们必须一个接一个地执行。所以我决定使用async库来一个接一个地执行。

脚本文件:

 function func1(param1,param2){
  //dosomething ..
 }
 function func2(param3,param4){
  //dosomething ..
 }
 function func3(param5,param6){
  //dosomething ..
 }
 function myfunction(arr){
   console.log(arr);
   async.series(arr,function(){
      //do something ..
 });
 }

HTML文件:

<a onclick="myfunction([func1('p1','p2'),func2('p3','p4'),func('p5','p6')])"></a>

但是,当我尝试使用console.log��,它会给出null,null,null。请提供一些解决方案。
1个回答

7
您没有传递函数引用数组,而是传递了调用这些函数的结果数组。该数组将包含这些函数返回的任何内容(如果它们没有返回任何内容,则为undefined)。
如果您想创建一个带有“内置”参数的函数引用,可以使用Function#bind:
myFunction([func1.bind(null, 'p1','p2'), ...])
//               ^^^^^^^^^^^^         ^

Function#bind 创建一个新的函数,当被调用时,会使用给定的 this 值(上面我使用了 null,假设 this 不重要)和你传递给 bind 的参数(再加上新函数被调用时传递的任何参数)来调用原始函数。

例如:

myfunction([
  func1.bind(null, 'p1', 'p2'),
  func1.bind(null, 'p3', 'p4'),
  func1.bind(null, 'p5', 'p6')
]);
function func1(arg1, arg2) {
  console.log("func1 got (" + arg1 + "," + arg2 + ")");
}
function myfunction(functions) {
  functions.forEach(function(f) {
    f();
  });
}


嗨,T.J. Crowder,谢谢您的回复,我会尝试这个。 - anil
在这种情况下,当您说“接着是新函数调用时的任何参数”时,这些参数将添加到上述代码的哪里?这些参数是否也会传递给原始函数,还是仅在新函数中使用? - Dellirium
2
@Dellirium:如果你这样做 var f = foo.bind(null, 1, 2); 然后 f(3, 4);,那么 foo 将会被调用并传入参数 1234。例如:来自 bind 的参数,接着是在调用绑定函数时提供的任何参数。(而且在调用 foo 时,this 要么是 null [在严格模式下],要么是全局对象 [在松散模式下]。) - T.J. Crowder
谢谢澄清,最后一个问题,如果在这种情况下我们使用 foo.bind(null) 然后调用 f(1,2)foo 会被传入1和2吗?我知道这破坏了绑定的意义,但我很好奇。 - Dellirium
@Dellirium:是的,它会。这并不会破坏绑定的目的,因为它仍然设置了特定的this,只是不影响参数。实际上,bind主要用于设置this - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接