Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在调用它的函数的回调中使用参数_Javascript_Asynchronous_Callback_Scope_Parameter Passing - Fatal编程技术网

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

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

如果我调用一个传递参数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 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
)。