gpt4 book ai didi

JavaScript 作用域问题

转载 作者:行者123 更新时间:2023-12-02 20:31:11 25 4
gpt4 key购买 nike

我有以下一段 javascript,但由于某些范围原因,从 myfunc 返回的“名称”为空。

var myfunc = function(client, id) {
var names = new Array();
client.query(
'SELECT stuff FROM mytable WHERE id="'+id+'"',
(function selectCb(err, results, fields) {
if (err) {
throw err;
}
for (result in results) {
// This prints fine
console.log(results[result].name);
names[result] = results[result].name;
}
client.end();
})
);
// The following returns empty
return names;
}

console.log(myfunc(1,2));

如何让它超出范围?

最佳答案

它是空的,因为对“查询”函数的调用是异步。在结果可用之前,您传递给它的函数不会运行。因此,您的“myfunc”函数会在调用该回调函数之前很久就立即返回。

在浏览器中使用 Javascript,您必须考虑这些方面。不要期望您的“名称”立即准备就绪,而是更改“myfunc”,以便向传递一个回调函数,以便在名称实际可用时调用:

var myfunc = function(client, id, whenFinished) {
var names = new Array();
client.query(
'SELECT stuff FROM mytable WHERE id="'+id+'"',
(function selectCb(err, results, fields) {
if (err) {
throw err;
}
for (result in results) {
// This prints fine
console.log(results[result].name);
names[result] = results[result].name;
}
client.end();
if (whenFinished) whenFinished(names); // callback
})
);
};

现在,当您调用函数时,您将传入另一个将作用于名称列表的函数,而不是期望“名称”作为返回值:

myfunc(1, 2, function(names) { console.log(names); });

关于JavaScript 作用域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4099785/

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