Javascript 在调用它的函数的回调中使用参数
如果我调用一个传递参数param的函数a,其中调用了异步函数B,那么异步函数B的回调C是否能够使用给定给函数a的参数param?如果是,如果在函数B启动和回调C被调用之间的时间内,我重新调用函数A,这种情况会改变吗 例如:Javascript 在调用它的函数的回调中使用参数,javascript,asynchronous,callback,scope,parameter-passing,Javascript,Asynchronous,Callback,Scope,Parameter Passing,如果我调用一个传递参数param的函数a,其中调用了异步函数B,那么异步函数B的回调C是否能够使用给定给函数a的参数param?如果是,如果在函数B启动和回调C被调用之间的时间内,我重新调用函数A,这种情况会改变吗 例如: function A(param) { value1 = param; doc = "hello"; //this is the async function B; database.insert(doc, function() { //this i
function A(param) {
value1 = param;
doc = "hello";
//this is the async function B;
database.insert(doc, function() {
//this is the invoked callback C when the async function is solved.
console.log(value1)
//can i log value1? yes. if yes, will this change if i re-invoke
//function A before the callback is invoked or two different processes will start?
})
}
A('hello');
A('not hello');
想知道如果在前一次调用的回调函数之前第二次调用函数,是否会在控制台上打印正确的值:
你好,;
不是你好
永远不会
不是你好;
不是你好
因为第二次调用会感染第一次调用 是的,传递给
数据库.insert()的内联回调将能够看到传递给函数A()
的参数。函数可以访问包含函数的任何参数甚至局部变量
而且,每一个都将被单独保存,因此您可以根据需要多次调用A()
,并且它们都将保留单独的参数
这个概念称为闭包,每次调用a()
都会创建一个单独的闭包,只要闭包中的任何代码(包括异步回调)尚未完成,闭包就会保持活动状态
不过,您需要在局部变量前面声明var
,使它们成为真正的局部变量,并且对于A()
的每次调用都是唯一的。如果没有var
,它们将成为隐式全局变量,一次调用A()
将与另一次调用A()
的全局变量相混淆。如果你这样做,你是安全的:
function A(param) {
var value1 = param;
var doc = "hello";
//this is the async function B;
database.insert(doc, function() {
//this is the invoked callback C when the async function is solved.
console.log(value1);
console.log(param);
console.log(doc);
//can i log value1? yes. if yes, will this change if i re-invoke
//function A before the callback is invoked or two different processes will start?
})
}
A('hello');
A('not hello');
是的,传递给数据库.insert()
的内联回调将能够看到传递给函数A()
的参数。函数可以访问包含函数的任何参数甚至局部变量
而且,每一个都将被单独保存,因此您可以根据需要多次调用A()
,并且它们都将保留单独的参数
这个概念称为闭包,每次调用a()
都会创建一个单独的闭包,只要闭包中的任何代码(包括异步回调)尚未完成,闭包就会保持活动状态
不过,您需要在局部变量前面声明var
,使它们成为真正的局部变量,并且对于A()
的每次调用都是唯一的。如果没有var
,它们将成为隐式全局变量,一次调用A()
将与另一次调用A()
的全局变量相混淆。如果你这样做,你是安全的:
function A(param) {
var value1 = param;
var doc = "hello";
//this is the async function B;
database.insert(doc, function() {
//this is the invoked callback C when the async function is solved.
console.log(value1);
console.log(param);
console.log(doc);
//can i log value1? yes. if yes, will this change if i re-invoke
//function A before the callback is invoked or two different processes will start?
})
}
A('hello');
A('not hello');
为了在回调闭包中捕获变量value1
,需要将其声明为局部变量:
var value1 = param;
为了在回调闭包中捕获变量value1
,需要将其声明为局部变量:
var value1 = param;
使用var
声明您的局部变量。首先感谢您。这是正确工作所必需的还是建议的@这只是一个需要养成的非常重要的习惯,也是一个需要理解的重要概念。好的,非常感谢你的建议。但这不是我要问的!:)使用var
声明您的局部变量。首先感谢您。这是正确工作所必需的还是建议的@这只是一个需要养成的非常重要的习惯,也是一个需要理解的重要概念。好的,非常感谢你的建议。但这不是我要问的!:)好的,谢谢你。但是,如果我在第一次调用之后,在解决第一次调用回调之前重新调用函数,这个值会改变吗?我的意思是,第一次调用callbak将打印第一个传递的参数。但是,如果我在第一次调用之后,在解决第一次调用回调之前重新调用函数,这个值会改变吗?我的意思是,第一次调用callbak将打印第一个传递的参数?函数参数也是闭包的一部分。不需要将它赋给局部变量。这是事实,但他在回调中没有使用参数,而是使用value1
。所以我展示了如何捕捉它。在这个示例程序中,它们是可互换的,但在实际应用中可能不是(例如,var value1=param*something
)。函数参数也是闭包的一部分。不需要将它赋给局部变量。这是事实,但他在回调中没有使用参数,而是使用value1
。所以我展示了如何捕捉它。在这个示例程序中,它们是可互换的,但在实际应用中可能不是(例如,var value1=param*something
)。