我对 JavaScript 相当陌生,我在 Node 中工作,这需要对异步编程和回调设计有很好的理解。我发现使用嵌入式函数非常容易,即使您的回调是多个级别的深度。您的嵌入式回调最终会成为闭包。
但是,当您有多层回调,其中许多回调在执行路由上是相似的时,您最终会在单独的回调链中一遍又一遍地重写大量回调代码。例如,如果下面的 mycb1 和 mycb2 定义被移到 A 之外,则它们不再具有对 A 变量的隐式访问,因此不再充当闭包。
具有嵌入定义的示例,其中它们充当闭包。
mod.A=function(){
var mycb1=function(err){
if (!err){
var mycb2=function(err){
cb(err);
};
mod.foo2(args,mycb2);
}
else{cb(err);}
};
mod.foo1(args,mycb1);
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
};
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
//execute
mod.A();
我想要执行以下操作,但能够更改 mycb1 和 mycb2 函数的变量范围,以便它们可以在调用它们的地方用作闭包。
例如:
var mycb2=function(err){
...
cb(err);
};
var mycb1=function(err){
if (!err){
mod.foo2(args,mycb2); //but have it act like a closure to mycb1
}
else{cb(err);}
};
mod.A=function(){
...
mod.foo1(args,mycb1); //but have it act like a closure to A
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
}
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
我知道我可以实现一种在 mod 级别设置变量的设计,以便 mod 级别的函数可以访问它们。然而,这似乎在某种程度上污染了 mod 作用域,因为该变量只能由其少数方法使用。我还知道我可以传入变量,以便在执行回调时可以访问它们。但是,如果我了解 JS 和回调是如何工作的,我就必须将它们传递给 fooX,然后让 foo 将它们传递给回调。这似乎也不是一个好的计划。
是否可以更改函数的变量范围,使其从执行点而不是定义点起像闭包一样?如果没有,模块化回调代码以便可以重用的最佳方法是什么?