首页 > 请教一下在javascript中使用ajax遇到的问题

请教一下在javascript中使用ajax遇到的问题

先贴上代码

<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。

【热门文章】
【热门文章】