Javascript和Jquery中变量的作用域

Javascript和Jquery中变量的作用域,javascript,jquery,json,scope,Javascript,Jquery,Json,Scope,我遇到了困扰我的事情。我做的代码如下 var json=''; function displayThumbnails(list) { json = list; for(var i in list) { var image = $("<img class='item'>").attr("src", list[i].thumbnail); $("#showThumbnails&quo

我遇到了困扰我的事情。我做的代码如下

var json='';
function displayThumbnails(list) {
    json = list;
    for(var i in list)
    {
        var image = $("<img class='item'>").attr("src", list[i].thumbnail);
        $("#showThumbnails").append(image);
    }  
}
alert(json);
var-json='';
函数显示缩略图(列表){
json=列表;
用于(列表中的var i)
{
变量图像=$(“
我想问一下,变量json的作用域也在函数之外,但警报显示空白值

当console.log(json)位于函数内部时,将显示结果。函数显示空值后json的作用域不会结束。为什么

应公众要求:D

这是mainpage.php


$(文档).ready(函数(){
var jqxhr=$.get(“php/list.php”,function()){
})
.完成(功能(数据){
var list=JSON.parse(数据);
控制台日志(列表);
显示缩略图(列表);
})
.fail(函数(){
警报(“哦,快照,服务器错误!!!重试”);
location.reload();
});
});

当到达
警报(json)
语句时,函数
显示缩略图
尚未调用,因此
json
的值仍然是
'

警报(json)到达时
语句到达函数
displayThumbnails
尚未调用,因此
json
的值仍然是
'

您的变量可以通过函数声明内和声明后的代码访问。另一个答案中提到的问题是,填充变量尚未执行

要确保使用变量的代码仅在填充变量后执行,可以使用回调函数,如下所示:

var json=''; 
// the second parameter should be a function
function displayThumbnails(list, callback) {
  var i, image;
  json = list; 
  for(i in list) { 
    image = $("<img class='item'>").attr("src", list[i].thumbnail);
    $("#showThumbnails").append(image);
  } 
  callback();
} 

doSomethingWithYourVariable = function() {
  alert(json);
};

// you can pass a callback function either by name, 
// then your call then should look similar to this:
displayThumbnails(list, doSomethingWithYourVariable);

// or pass an anonymous callback function:
displayThumbnails(list, function() {
  alert(json);
});

有关更详细的介绍,请参见

函数声明内的代码和声明后的代码都可以访问变量。正如另一个答案中提到的,这里的问题是,填充变量的代码尚未执行

要确保使用变量的代码仅在填充变量后执行,可以使用回调函数,如下所示:

var json=''; 
// the second parameter should be a function
function displayThumbnails(list, callback) {
  var i, image;
  json = list; 
  for(i in list) { 
    image = $("<img class='item'>").attr("src", list[i].thumbnail);
    $("#showThumbnails").append(image);
  } 
  callback();
} 

doSomethingWithYourVariable = function() {
  alert(json);
};

// you can pass a callback function either by name, 
// then your call then should look similar to this:
displayThumbnails(list, doSomethingWithYourVariable);

// or pass an anonymous callback function:
displayThumbnails(list, function() {
  alert(json);
});


有关更详细的介绍,请参见

这个JSON从何而来,ajax?因为警报在函数之外,并且在调用函数之前被调用。请将警报放在函数内部。@ShaunakD-您怎么知道,在发布的代码中根本没有函数调用?@adeneo您看到了吗?
显示缩略图
没有被调用。@SpencerWieczorek-没有,我写了“没有函数调用…”,所以很明显我没有看到函数调用,但是OP写了“当console.log(json)在函数结果中时”",所以它在某个地方被调用,但谁知道在哪里?这个JSON从哪里来,ajax?因为警报在函数之外,并且在调用函数之前被调用。将警报放在函数内部。@ShaunakD-你怎么知道,在发布的代码中根本没有函数调用?@adeneo你看到了吗?
displayThumbnai没有调用ls
。@SpencerWieczorek-没有,我写了“没有函数调用…”,所以很明显我没有看到函数调用,但OP写了“当console.log(json)在函数中时,结果显示”,所以它在某个地方被调用,但谁知道在哪里呢?如何解决这个问题。我还面临这样的问题:AJAX调用运行异步,而依赖它的rest脚本最终会有null或空值。我了解到,这可以通过使call Async:false来实现,这是一种糟糕的编码实践。此外,它是否应该遵循正确的编码方法运行时自上而下的流就像其他HTML和js文件一样,它只是一个函数声明,函数中的任何代码都不会执行,直到从其他地方调用
displayThumbnails
。如何解决这个问题。我还面临这样的问题,AJAX调用运行异步脚本和具有依赖关系的rest脚本我了解到,这可以通过调用async:false来实现,这是一种糟糕的编码实践。此外,如果它在运行时不像其他HTML和js文件那样遵循正确的自上而下的流程,那么它只是一个函数声明,函数中的任何代码在
displayThum之前都不会执行bnails
是从其他地方调用的。嘿@Kevin Busse,我刚刚开始编写代码。我不知道callback();我可以在某个地方读一下这个链式调用吗?这个术语在AJAX中也经常使用。我想要一个文档来解释为什么称为回调,以及如何在AJAX之外使用回调。你可以用它来做调用链式连接,或者将控制权交还给异步调用的位置。因为每个AJAX调用都是异步的,所以在那里经常使用它我会相应地更新我的答案。有关回调的一般介绍,请参阅:嘿@Kevin Busse,我刚刚开始编写代码。我不知道回调();我可以在某个地方读一下这个链式调用吗?这个术语在AJAX中也经常使用。我想要一个文档来解释为什么称为回调,以及如何在AJAX之外使用回调。你可以用它来做调用链式连接,或者将控制权交还给异步调用的位置。因为每个AJAX调用都是异步的,所以在那里经常使用它我将相应地更新我的答案。有关回调的一般介绍,请参阅:
jQuery.get('list.php', function(data) {
  // this already is an asynchronous callback function
  // that will be called when the request completes
});

// code here would be called immediately
// the request will most likely not be completed and no data available