js全局变量,为什么总是undefind ,但是alert一下就有数据了

$(function(){
var obj;
var ct;
var movie;
var yuanxian;
var yx_movie;
$.getJSON(encodeURI("<%=basePath%>MapAction!query.action"),
function(data) {
movie = data.movie;//这里有值
});
//alert(movie);//提示undefined
mappic();
tb_yx(movie);如果不alert一下这就是undefind
});

一楼回答得很好,异步请求就是先不管这个请求(因为这个请求不知道要多少时间,这里要看网速了),所以会直接执行getJSON后面的代码。
我在想如果网速快过计算机的运算速度,会不会这个movie就能拿到值呢。于是我特意去测试了一下,答案是不会
比如:

 var a = new Date().getTime()
console.log('a'+a)
setTimeout(function(){
  var b = new Date().getTime()
  console.log('b'+b)
},1)
var i=0;
while(i<100){
  console.log(i++)
}

可能是ajax请求根本没执行通过,movie没得到赋值导致movie没有被初始化所以alert是undefind

@showbo 回答很专业

alert 之后 有了缓冲时间。你可以改成同步的就没有问题。

 var a = new Date().getTime()
console.log('a'+a)
setTimeout(function(){
  var b = new Date().getTime()
  console.log('b'+b)
},1)
var i=0;
while(i<100){
  console.log(i++)
}

手残了,第一次回答没想到这个排序是这样的