if i call a function A passing a parameter param, in which an asynchronous function B is called, will the callback C of the asynchronous function B be able to use the parameter param given to function A ? if yes, will this change if in the time between the function B start and the callback C is invoked i re-invoke function A?
Example:
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');
Wondering if this, if for the second time A function is invoked before the callback function of the previous invocation, will print the right values on console:
hello; not hello;
and never not hello; not hello;
cause second time's invocation infects first time one.
Yes, the inline callback passed to
database.insert()
will be able to see the argument passed to functionA()
. A function has access to any arguments or even local variables in the containing functions.And, each one will be saved separately so you can call
A()
as many times as you want and they will each retain separate arguments.This concept is called a closure, a separate closure is created for each invocation of
A()
and the closure stays alive as long as any code inside it (including asynchronous callbacks) has not yet completed.You WILL though need to declare your local variables with
var
in front of them for them to be truly local variables and unique for each invocation ofA()
. Without thevar
, they become implicit global variables and one invocation ofA()
will mess with the global variables of another invocation ofA()
. If you do it like this, you are safe:In order for the variable
value1
to be captured in the callback closure, you need to declare it as a local variable: