2014-02-25 232 views
0

如果我调用函数传递参数参数(其中调用异步函数B),异步函数B的回调函数C将能够使用给定的参数参数函数A?如果是的话,如果在函数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'); 

想知道这一点,如果在第二时间函数的先前调用的回调函数调用之前,将打印在控制台右侧的值:

你好; 不是你好;

并且从不 不是你好; 不是你好;

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

+1

**用'var'声明你的局部变量** – Pointy

+0

先谢谢你。这是需要正确的工作还是只是建议? @Pointy – Morrisda

+0

这只是一个非常重要的习惯,也是一个重要的理解。 – Pointy

回答

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'); 
+0

好的,谢谢你。但是如果我在第一次调用回调被解决之前第一次调用后重新调用函数,这个值是否会改变?我的意思是,第一个调用callbak将打印第一个传递的参数? – Morrisda

+0

@Morrisda - 查看我的更新。 – jfriend00

+0

好的,这解决了我所有疑惑的家伙。非常感谢! – Morrisda

0

为了使变量value1在回调封捕获,您需要将其声明为一个局部变量:

var value1 = param; 
+1

函数参数也是闭包的一部分。不需要将其分配给局部变量。 – jfriend00

+1

这是真的,但他在回调中没有使用参数,他使用'value1'。所以我展示了如何捕捉它。在这个示例程序中它们是可互换的,但在实际应用中它们可能不是(例如'var value1 = param * something')。 – Barmar