Javascript:闭包问题,我猜..或者什么奇怪的事情?

发布于 2024-11-04 08:17:15 字数 517 浏览 0 评论 0原文

嗯,我使用 JQuery 进行 Ajax Post 请求并获取数据。

Ajax 工作正常,但是:

coordinates = [];

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); alert(coordinates); });  // Alerts the Coordinates as Expected :)

但是..

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); });

alert(coordinates); // Alerts with a Blank Box :(

为什么会发生这种情况?
两者都应该使用相同的数据发出警报......因为坐标对于两者来说都是全局的!

Well, I was using JQuery for Ajax Post request and getting the data back.

Ajax is working fine, but:

coordinates = [];

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); alert(coordinates); });  // Alerts the Coordinates as Expected :)

But..

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); });

alert(coordinates); // Alerts with a Blank Box :(

Why is this happening ?
Both should alert with same data.. as coordinates is global to both!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

糖果控 2024-11-11 08:17:15

在这一例中:

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); });
alert(coordinates); 

您甚至在帖子从服务器返回之前就立即执行警报。

所以我想说这个问题更多地与执行顺序有关,而不是与闭包有关。

In this one:

$.post("ajax_markers.php",{time:time},function(result) { coordinates=result.split(','); });
alert(coordinates); 

You are immediately doing the alert before the post even returns from the server.

So I would say the problem has more to do with the order of execution than the closure.

九八野马 2024-11-11 08:17:15

您的 alert(coordinates);function(result) {...} 调用之前执行。
欢迎来到异步世界。

Your alert(coordinates); executes before function(result) {...} invocation.
Welcome to the asynchronous world.

醉酒的小男人 2024-11-11 08:17:15

这是有道理的。在您的第二个示例中, alert(coordinates); 立即发生。而 coordinates = result.split(','); 发生的时间相对较晚 - 在请求成功之后。如果你想让第二个例子工作,你必须等待坐标被分配。像这样的工作小提琴:

http://jsfiddle.net/UtXgK/11/

var coordinates = 'no response from server yet';
$.post("/echo/json/",{json:'{"data":"one,two,three"}'},function(result) { coordinates=result.data.split(','); alert(coordinates[1]);});
setTimeout(function(){ alert(coordinates[2]); }, 5000);

假设不需要从 $.post 返回结果的时间超过 5 秒。

It makes sense. In your second example, alert(coordinates); is happening right away. Whereas coordinates = result.split(','); is happening relatively much later - after the request succeeds. If you want to make the second example work, you have to wait for the coordinates to be assigned. Something like this working fiddle:

http://jsfiddle.net/UtXgK/11/

var coordinates = 'no response from server yet';
$.post("/echo/json/",{json:'{"data":"one,two,three"}'},function(result) { coordinates=result.data.split(','); alert(coordinates[1]);});
setTimeout(function(){ alert(coordinates[2]); }, 5000);

Assuming it takes no longer than 5 seconds to return a result from your $.post.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文