首页 > 外部函数怎样访问内部函数变量值?

外部函数怎样访问内部函数变量值?

外部函数怎样访问内部函数变量值?
function loadData(){

var data1 = 0;
$.each([0,1,2,3], function(k, v){
    if(v==0){
        $("body").post("ajaxUrl", {"data1":data1}, function(data){
            if (data.length ==0){
                data1 = 1;
            } else {
                console.log("error");
            }
        })
    } else {
        console.log("error");
    }
});
alert(data1); //输出为0;怎样才能让这里输出为1??

}


你的问题并不是「外部函数怎样访问内部函数变量值?」
而应该是怎样访问异步函数返回值,答案就是使用回调函数。我看你使用了 jQuery,你可以看看关于 deferred 的内容,为了便于理解,看这篇阮一峰老师的文章好了:
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html


$("body").post(url,data,callback);

callback是异步回调,实际上整个代码的执行顺序是

//step 1
var data1=0;
//step 2
$.each(array,func)
//step 3
alert(data1);
//step 4
callback()

callback要等post请求返回后才会执行,而这个等待时间里,step 3早就已经执行过了。


jq的话,把ajax的参数async设为FALSE应该是最简单的做法了


问题在于$.post是一个异步操作,在post外面alert的时候,data1值还没有改变。
如果你要在loadData外面获取post之后的data1的值,可以试着把对data1的操作包装成回调函数传递给loaddata,然后在post里面调用回调函数


用你这种写法,没有办法实现。

因为你的代码里面的

function(data) {
    // ...
}

这个函数是一个异步过程(AJAX请求)的回调函数,它一定是在alert(data1)之后被调用的。所以你alert出来的结果一定是0。

办法就是改变程序的结构。比如使用Promise,或者某些处理异步的类库(如async等)。

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