Javascript 变量作用域和jQuery.getJSON()方法

Javascript 变量作用域和jQuery.getJSON()方法,javascript,jquery,scope,Javascript,Jquery,Scope,jQuery.getJSON()方法似乎忽略了JavaScript中的正常作用域规则 给定这样的代码 someObject = { someMethod: function(){ var foo; $.getJSON('http://www.somewhere.com/some_resource', function(data){ foo = data.bar; }); alert(foo); /

jQuery.getJSON()
方法似乎忽略了JavaScript中的正常作用域规则

给定这样的代码

someObject = {
    someMethod: function(){
        var foo;

        $.getJSON('http://www.somewhere.com/some_resource', function(data){
            foo = data.bar;
        });

        alert(foo); // undefined
    }
}

someObject.someMethod();

是否有访问getJSON范围外变量值的最佳实践?

代码的问题是,在JSON请求返回后(在回调函数中)设置了foo。将警报移动到回调中可以解决此问题


就范围而言,代码很好。因为javascript有闭包,所以回调函数可以访问周围的上下文(包括foo变量)。因此,当您设置foo时,您设置的是相同的变量。

这不是关于
getJSON()
的一些奇怪的特性。这是非常正常的JS行为——毕竟您使用的是回调函数。从上下文中完全分离并单独运行的回调

最好的方法是在回调中正确处理所有问题:

someObject = {
  someMethod: function(){
    $.getJSON('http://www.somewhere.com/some_resource', function(data) {
      var foo = data.bar;
      alert(foo);
    });
  }
}

从我最初的帖子中不清楚的是,getJSON方法中的foo集的值将在以后的函数中使用,这就是为什么变量在getJSON方法之外初始化的原因,尽管显然有一部分JavaScript需要清除。