Javascript js变量范围问题

Javascript js变量范围问题,javascript,jquery,Javascript,Jquery,如何使数据覆盖结果变为变量 var ajax = { get : { venues : function(search){ var results = "@"; $.getJSON("http://x.com/some.php?term="+search+"&callback=?",function(data){ results = data; }); return results;

如何使数据覆盖结果变为变量

var ajax = {
    get : {
        venues : function(search){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",function(data){ results = data; });
            return results;
        }
    }
};
返回
结果后,
数据
正在覆盖
结果

您可以使用该函数而不是
getJSON
,因为它只是

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
然后还将
async
设置为
false
,以便调用将被阻止

但是,在您的情况下,这将不起作用,因为JSONP请求(带有
“?回调=?”
)不能同步

另一个(更好的)选项是让
success
回调调用依赖于
results
返回值的任何代码

    var ajax = {
      get : {
        venues : function(search, fnCallback){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
                function(data){ 
                    // success
                    results = data; 
                    (typeof fnCallback == 'function') && fnCallback(data);
                });
            return results;
        }
    }
};

ajax.get.venues(term, function(result){
    // Do stuff with data here :)
})
因此,与此不同的是:

var results = ajax.get.venues('search');
$('#results').html(translateResults(results));
ajax.get.venues('search', function (results) {
    $('#results').html(translateResults(results));
});

venues = function (search, callback) {
    $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
              function(data){
                  callback(data); 
              });
};
也许是这样的:

var results = ajax.get.venues('search');
$('#results').html(translateResults(results));
ajax.get.venues('search', function (results) {
    $('#results').html(translateResults(results));
});

venues = function (search, callback) {
    $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
              function(data){
                  callback(data); 
              });
};
返回
结果后,
数据
正在覆盖
结果

您可以使用该函数而不是
getJSON
,因为它只是

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
然后还将
async
设置为
false
,以便调用将被阻止

但是,在您的情况下,这将不起作用,因为JSONP请求(带有
“?回调=?”
)不能同步

另一个(更好的)选项是让
success
回调调用依赖于
results
返回值的任何代码

    var ajax = {
      get : {
        venues : function(search, fnCallback){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
                function(data){ 
                    // success
                    results = data; 
                    (typeof fnCallback == 'function') && fnCallback(data);
                });
            return results;
        }
    }
};

ajax.get.venues(term, function(result){
    // Do stuff with data here :)
})
因此,与此不同的是:

var results = ajax.get.venues('search');
$('#results').html(translateResults(results));
ajax.get.venues('search', function (results) {
    $('#results').html(translateResults(results));
});

venues = function (search, callback) {
    $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
              function(data){
                  callback(data); 
              });
};
也许是这样的:

var results = ajax.get.venues('search');
$('#results').html(translateResults(results));
ajax.get.venues('search', function (results) {
    $('#results').html(translateResults(results));
});

venues = function (search, callback) {
    $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
              function(data){
                  callback(data); 
              });
};

您的问题在于JavaScript的异步特性<代码>结果
确实会被覆盖,但只有在函数退出后才会被覆盖,因为回调是在请求完成时执行的


您必须使用
sync:true
使Ajax调用同步(这通常不是一个好主意,只是为了完整起见才提到它),或者重新构造代码流,使其不再依赖于
返回值,但是您需要做的一切都在回调函数中完成。

您的问题在于JavaScript的异步特性<代码>结果
确实会被覆盖,但只有在函数退出后才会被覆盖,因为回调是在请求完成时执行的


您必须使用
sync:true
使Ajax调用同步(这通常不是一个好主意,只是为了完整起见才提到它),或者重新构造代码流,使其不再依赖于
返回值,但是您需要做的一切都在回调函数中完成。

这不是范围问题。这是因为
$.getJSON
是异步的<代码>结果
$之前返回。getJSON
完成。尝试对
$.getJSON
进行回调,以便在完成时调用

function JSON_handler(data){
    // do stuff...
}

$.getJSON("http://x.com/some.php?term="+search+"&callback=?", JSON_handler);

这不是范围问题。这是因为
$.getJSON
是异步的<代码>结果
$之前返回。getJSON
完成。尝试对
$.getJSON
进行回调,以便在完成时调用

function JSON_handler(data){
    // do stuff...
}

$.getJSON("http://x.com/some.php?term="+search+"&callback=?", JSON_handler);

您可以将要运行的逻辑放入回调中

    var ajax = {
      get : {
        venues : function(search, fnCallback){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
                function(data){ 
                    // success
                    results = data; 
                    (typeof fnCallback == 'function') && fnCallback(data);
                });
            return results;
        }
    }
};

ajax.get.venues(term, function(result){
    // Do stuff with data here :)
})

函数式编程很有趣。

您可以将要运行的逻辑放入回调中

    var ajax = {
      get : {
        venues : function(search, fnCallback){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
                function(data){ 
                    // success
                    results = data; 
                    (typeof fnCallback == 'function') && fnCallback(data);
                });
            return results;
        }
    }
};

ajax.get.venues(term, function(result){
    // Do stuff with data here :)
})

函数式编程很有趣。

不是范围问题。您需要了解异步代码和回调是如何工作的。参见,其他落入相同陷阱的人。这不是范围问题。您需要了解异步代码和回调是如何工作的。其他人也落入了同样的陷阱。