2013-06-07 2 views
0

В следующем коде предупреждение внутри функции работает нормально, но второе имеет переменную неопределенную, и все же я разделил переменную за пределами функции. Почему это?Javascript Область применения: переменная не определена

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? имеет однозначного объяснения и ответ.

+10

Подсказка: асинхронной против синхронизации. –

+0

@rob ах !!, хорошо извините! – Gamemorize

+0

В дополнение к дубликату выше, объясняющему, как справиться с проблемой, стоит отметить, что 'function (data) {' создает новую локальную переменную, называемую 'data', которая маскирует ее из более широкой области. – Quentin

ответ

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); 

Как в стороне, я рекомендую использовать $.ajax вместо $. если вы собираетесь использовать стиль обратного вызова вместо обещаний. Причина в том, что $ .ajax обеспечивает обратный вызов ошибки, а $ .post - нет.

1

Ссылка на параметр data в параметре функции и вне функции - это разные переменные. В первом случае он находится в глобальном масштабе, а во втором - в локальной области. Они совершенно разные.

пример иллюстрирует проблему ....

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

Вы можете попробовать это:

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