gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 15:46:44 24 4
gpt4 key购买 nike

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

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

你好;不是你好;

从来没有不是你好;不是你好;

因为第二次的调用会感染第一次。

最佳答案

是的,传递给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');

关于javascript - 在调用它的函数的回调中使用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22002349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com