Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数在对所有变量进行操作之前是否接收它们?_Javascript_Function_Parameter Passing - Fatal编程技术网

Javascript 函数在对所有变量进行操作之前是否接收它们?

Javascript 函数在对所有变量进行操作之前是否接收它们?,javascript,function,parameter-passing,Javascript,Function,Parameter Passing,我对函数接收多个变量,然后对它们执行操作有问题。让我们举个简单的例子: function first(){ var one = 1; result(one); // I mean it should be result(one, null); but I want to pass second variable later } //lets assume function first get some asyns operations... setTimeout(functio

我对函数接收多个变量,然后对它们执行操作有问题。让我们举个简单的例子:

function first(){
    var one = 1;
    result(one); // I mean it should be result(one, null); but I want to pass second variable later
}

//lets assume function first get some asyns operations...
setTimeout(function(){
    first();
}, 2000);

function second(){
    var two = 2;
    result(two); // should be result(null, two), but one will be passed after a 2 seconds and I want to sum them
}

second();

function result(one, two){
    var ultraHardMath = one + two;
}

所以我想等到result()接收到所有需要的变量(一个和两个),然后再进一步使用ultraHardMath。如何做到这一点?

您可以使用以下代码: 它使用闭包的概念,所以结果函数可以等待。 这就是你要找的吗

(函数(){
var funcFoo;
函数优先(){
Var1=1;
funcFoo(one);//我的意思是它应该是result(one,null);但我想稍后传递第二个变量
}
//让我们先假设函数得到一些asyns操作。。。
setTimeout(函数(){
第一个();
}, 2000);
函数第二(){
Var2=2;
funcFoo=result(two);//应该是result(null,two),但2秒后将传递一个,我想求和
}
第二个();
功能结果(二){
返回函数foo(一){
var ultraHardMath=1+2;
console.log(ultraHardMath);
}
}

})();您可以将传入的参数存储在函数本身(
this
)中,然后在考虑所有参数后执行函数的逻辑:

function result(one, two) {
  if (one !== undefined) this.one = one;
  if (two !== undefined) this.two = two;
  if (this.one === undefined || this.two === undefined) return;
  var ultraHardMath = this.one + this.two;
}
通过省略尾随参数或将
未定义的
传递给您不想提供的参数来实现:

result(undefined, 2);
...
result(1);
这种逻辑可以推广到一个函数,该函数“调用”传入的参数,并在考虑所有参数时调用原始函数。它是一种局部应用程序,也关心“中间”提供的参数:

其工作方式与之前相同:

result(undefined, 2);
...
result(1);
召回
可以简化一点:

function recall(fn, n) {
  var stored = [];
  return function() {
    var all = true;
    for (var i = 0; i < n; ++i) {
      if (arguments[i] !== undefined) stored[i] = arguments[i];
      if (stored[i] === undefined) all = false;
    }
    if (all) return fn.apply(null, stored);
  };
}
功能调用(fn,n){
存储的var=[];
返回函数(){
var all=真;
对于(变量i=0;i
您可能需要查看
承诺。所有
然后
使用承诺!:-)我开始讨论承诺,但是没有承诺和异步(模块)有没有办法做到这一点?@webmasternewbie是的,但它非常复杂。基本上,您必须使用标志来记住哪些值已经传递,并在所有内容都存在时执行您的逻辑。非常有趣的想法!而且描述得很好。我的问题是我有很多异步函数(为了简单起见,让我们说它们都是请求)5或6。他们在后台工作,获取数据。我的主要功能几乎是在开始时运行的,它的主要目的是从这些请求(功能)接收数据并进行一些调整。问题是它在接收第一个数据元素时运行。我希望它将所有数据存储在其中(这可能需要很长时间,因为某些请求比rest慢得多),然后执行整个函数(它只是将数据传递给渲染)。我确实将此标记为接受的答案,因为它描述得很好,而且添加额外的结果元素更容易。一切都很完美,但我最终还是做出了承诺:)-更容易处理错误@乔德昂荣誉!BTW@PankajShukla的回答很好,但当我尝试添加更多功能时,我有真正的想法。
result(undefined, 2);
...
result(1);
function recall(fn, n) {
  var stored = [];
  return function() {
    var all = true;
    for (var i = 0; i < n; ++i) {
      if (arguments[i] !== undefined) stored[i] = arguments[i];
      if (stored[i] === undefined) all = false;
    }
    if (all) return fn.apply(null, stored);
  };
}