Javascript范围:未定义的变量

时间:2013-06-07 13:21:14

标签: javascript scope

在下面的代码中,函数内部的警报工作正常,但第二个函数的变量未定义,但我已经在函数外部对变量进行了描述。为什么是这样?

var data = [];
$.post(
        'matchEngine.php', 
        function(data) {
                for (var i = 0, len= data.length;i <len; i++) {
                for ( h = 0, len2= data[i].length;h <len2; h++) {

                data[i][h][0]=(data[i][h][0])*30;
                data[i][h][1]=(data[i][h][1])*30;
                data[i][h][3]=data[i][h][3].replace(/\"/,"");

                }
                }
                alert(data[0][0][0]);
            }

        ); 
alert(data[0][0][0]);

如果您遇到类似问题,以下How to return the response from an AJAX call?会有明确的解释和答案。

3 个答案:

答案 0 :(得分:1)

函数参数和函数外部的引用data是不同的变量。在第一种情况下,它在全球范围内,在第二种情况下在本地范围内。它们完全不同。

该示例说明了问题......

    var data=2;//this
    function fun(data){ //and this are different
              alert(data);
     }
     var data2=3;
     fun(data2);

答案 1 :(得分:0)

正如pinkpanther所指出的,data回调中的本地$.post变量与函数外部的data变量不是同一个变量。

此外,自$.post is asynchronous起,您需要传递一个回调或使用它返回的deferred对象来访问响应。

$.post('matchEngine.php').then(function(data){alert(data)})

例如,如果您希望能够将响应传递给其他函数,则可以执行以下操作:

function doPost(url){
    return $.post(url);
}

function processResponse(response) {
    alert(response);
}

responsePromise = doPost("matchEngine.php");
responsePromise.then(processResponse);

另外,如果您打算使用回调样式而不是promises,我建议使用$.ajax而不是$ .post。原因是$ .ajax提供了错误回调而$ .post没有。

答案 2 :(得分:0)

你可以试试这个:

var data = [];
var myRequest = $.post(
    /* your stuff */
); 
myRequest.done(function() { alert(data[0][0][0]); })