在调用它的函数的回调中使用参数

时间:2014-02-25 00:44:50

标签: javascript asynchronous callback scope parameter-passing

如果我调用函数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');

想知道是否这样,如果第二次在前一次调用的回调函数之前调用一个函数,将在控制台上打印正确的值:

您好; 不是你好

永远不会 不是你好 不是你好;

导致第二次调用第一次感染。

2 个答案:

答案 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;