先贴上代码
<script>
'use strict';
//定义一个简单的ajax函数
function ajax(url, fnSucc, fnFaild)
{
//1.创建Ajax对象
if(window.XMLHttpRequest)
{
var oAjax=new XMLHttpRequest();
}
else
{
var oAjax=new ActiveXObject("Microsoft.XMLHTTP");
}
//2.连接服务器(打开和服务器的连接)
oAjax.open('GET', url, true);
//3.发送
oAjax.send();
//4.接收
oAjax.onreadystatechange=function ()
{
if(oAjax.readyState==4){
if(oAjax.status==200){
//成功取回数据后,调用传入的函数
fnSucc(oAjax.responseText);
}
else{ //如果取数据失败,调用下面的函数
if(fnFaild){
fnFaild()
}
}
}
};
}//ajax函数定义结束
//声明一个全局变量:
var temp=10;
//定义一个函数 getData
function getData(){
ajax('baiduwiki.txt',
function(str){ //成功返回数据的函数
temp=5; //修改全局变量的值
alert('接收到的数据:'+str)
alert('回调函数内的temp:'+temp); //第一次弹出temp的值:5
},
function(){ //未能成功取回数据的函数
alert('失败!');
}
);
//第二次弹出temp的值:在回调函数内temp=5了,为何弹出10?
alert(temp);
}
//调用getData
getData();
</script>
对不住各位,问题代码有点长
我先定义了一个ajax函数、一个值为10的全局变量temp、一个自定义函数getData。在传给ajax的回调函数中,我重新给temp变量赋值temp=5。
调用getData。
我的问题是
alert('接收到的数据:'+str):数据可以正常返回。
alert('回调函数内的temp:'+temp):这次temp的值是5,因为我重新赋值为5。
在ajax调用后,我第二次弹出temp的值,temp为10?请问这是为什么?谢谢!
baiduwiki.txt文件装的是一个数组,每个数组元素是json格式的数据:
[{'href':'http://www,baidu.com','img':'img/doom.jpg','word':'MF Doom','intro':'MF Doom.MF Doom.MF Doom.MF Doom.MF Doom.'},{'href':'http://www,baidu.com','img':'img/nas.jpg','word':'Nas','intro':'Nas.Nas.Nas.Nas.Nas.Nas.'}]
ajax是异步的,不是写在后面就后执行。
给你的阮大的链接:Javascript异步编程的4种方法
没明白楼主的第二次弹出 是什么意思?
你最后的 alert(temp);
明明是第一个被弹出来的.
在它弹的时候你的 temp
还没被改呢.
因为你的ajax是异步的, 所以你里面的回调函数是后执行的.
即你是先弹出来的 原始值, 然后在 获取数据成功的时候改成了 5.
很明显楼主还没有真正理解javascript异步回调函数的过程。
在执行getData函数
的时候首先调用ajax函数
,ajax函数
则给onreadystatechange
事件注册(注意是注册,并没有执行)了一个方法,紧接着alert(temp)
(此时temp还没被修改,还是10);
然后:ajax收到返回信息,触发onreadystatechange事件,执行之前注册的函数,才修改了temp的值,alert出修改后的temp
所以前一个alert(temp)
弹出的是5,后一个alert(temp)
弹出的是10。