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);
};
}