如果我调用函数A传递参数param,其中调用异步函数B,异步函数B的回调C是否能够使用给函数A的参数param?如果是,如果在函数B start和调用回调C之间的时间内重新调用函数A,这会改变吗?
示例:
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');
想知道是否这样,如果第二次在前一次调用的回调函数之前调用一个函数,将在控制台上打印正确的值:
您好; 不是你好
永远不会 不是你好 不是你好;
导致第二次调用第一次感染。
答案 0 :(得分:3)
是的,传递给database.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');
答案 1 :(得分:0)
为了在回调闭包中捕获变量value1
,您需要将其声明为局部变量:
var value1 = param;