Javascript变量不保留值
可能重复:Javascript变量不保留值,javascript,jquery,ajax,Javascript,Jquery,Ajax,可能重复: 我有一个函数,可以在线从文件中读取数字数据。虽然文件被正确检索(由警报显示的值证明),但当我尝试将其设置为output然后返回output时,会得到一个未定义的结果 我尝试过范围界定教程,但没有成功。我做错了什么 function readFileFromWeb() { var output; jQuery.get('http://domain.com', function(data) { alert(data); output =
我有一个函数,可以在线从文件中读取数字数据。虽然文件被正确检索(由警报显示的值证明),但当我尝试将其设置为output然后返回output时,会得到一个未定义的结果 我尝试过范围界定教程,但没有成功。我做错了什么
function readFileFromWeb() {
var output;
jQuery.get('http://domain.com', function(data) {
alert(data);
output = data;
});
return output;
}
下面是如何通过回调函数完成的
function readFileFromWeb(callback) {
jQuery.get('http://domain.com', function(data) {
callback && callback(data);
});
}
// ...
readFileFromWeb(function (data) {
alert(data);
});
这是因为jQuery.get
是一个异步函数,即它在执行时不会阻塞,因此会立即返回。这就是为什么jQuery.get
函数需要回调函数的原因,这样一旦AJAX查询返回,它就会启动回调函数
因此,在实现自己的
readFileFromWeb
函数时,您需要使用相同的回调模式。下面是如何通过回调函数完成的
function readFileFromWeb(callback) {
jQuery.get('http://domain.com', function(data) {
callback && callback(data);
});
}
// ...
readFileFromWeb(function (data) {
alert(data);
});
这是因为jQuery.get
是一个异步函数,即它在执行时不会阻塞,因此会立即返回。这就是为什么jQuery.get
函数需要回调函数的原因,这样一旦AJAX查询返回,它就会启动回调函数
因此,在实现自己的
readFileFromWeb
函数时,您需要使用相同的回调模式。它是异步的,我对您的代码进行了注释,以帮助您了解事情发生的顺序
function readFileFromWeb(callback) {
jQuery.get('http://domain.com', function(data) {
callback && callback(data);
});
}
// ...
readFileFromWeb(function (data) {
alert(data);
});
function readFileFromWeb() {
//1. create variable.
var output;
//2. make ajax call.
jQuery.get('http://domain.com', function(data) {
alert(data);
//4. set variable from ajax callback
output = data;
});
//3. return variable.
return output;
}
它是异步的,我对您的代码进行了注释,以帮助您理解事情发生的顺序
function readFileFromWeb() {
//1. create variable.
var output;
//2. make ajax call.
jQuery.get('http://domain.com', function(data) {
alert(data);
//4. set variable from ajax callback
output = data;
});
//3. return variable.
return output;
}
欢迎来到异步的精彩世界!菲利克斯克林:当我在那个问题下看到你的名字时,我震惊了片刻/这里有两种方法可以实现您想要的功能:1)使您的AJAX同步2)实现基于计时器的功能,该功能将等待响应为您想要使用的变量赋值。@MarcellFülöp这两种方法都很糟糕。我建议理解和接受异步性。@MarcellFülöp我不是在说你,我是在向其他人推荐。如果人们不理解异步,我建议他们先理解它。方法是不返回,而是传递/使用回调。或者回报一个承诺。欢迎来到异步的精彩世界!菲利克斯克林:当我在那个问题下看到你的名字时,我震惊了片刻/这里有两种方法可以实现您想要的功能:1)使您的AJAX同步2)实现基于计时器的功能,该功能将等待响应为您想要使用的变量赋值。@MarcellFülöp这两种方法都很糟糕。我建议理解和接受异步性。@MarcellFülöp我不是在说你,我是在向其他人推荐。如果人们不理解异步,我建议他们先理解它。方法是不返回,而是传递/使用回调。或者返回一个承诺。你能描述一下它的作用吗
callback&&callback(数据)代码>?如果回调作为参数传递,它就会执行,不是吗?是的,我正在使用逻辑运算符中使用的短路机制,仅在回调包含truthy值时调用Callback
。请注意,如果回调
不是函数,则此代码仍将失败,因为我没有验证它。我明白了,10倍于此,谢谢大家的有见地的评论!如果我理解正确的话:1。我使用一个函数(对结果进行处理)作为参数调用readFileFromWeb。2.readFileFromWeb执行异步get,然后调用回调,这是我们定义的匿名函数。这是对的吗?@KangHeong:是的。另外请记住,readFileFromWeb
函数会立即返回,因为jQuery.get
会立即返回。您能描述一下回调和回调(数据)的作用吗代码>?如果回调作为参数传递,它就会执行,不是吗?是的,我正在使用逻辑运算符中使用的短路机制,仅在回调包含truthy值时调用Callback
。请注意,如果回调
不是函数,则此代码仍将失败,因为我没有验证它。我明白了,10倍于此,谢谢大家的有见地的评论!如果我理解正确的话:1。我使用一个函数(对结果进行处理)作为参数调用readFileFromWeb。2.readFileFromWeb执行异步get,然后调用回调,这是我们定义的匿名函数。这是对的吗?@KangHeong:是的。还要记住,readFileFromWeb
函数会立即返回,因为jQuery.get
会立即返回。+1用于列出评估顺序。+1用于列出评估顺序。