Javascript变量作用域不工作

Javascript变量作用域不工作,javascript,jquery,scope,Javascript,Jquery,Scope,我正在尝试解析JSON。我正在使用 $getJSON 获取文件并将其内容保存到变量 JSONfile ,然后我将其传递给解析函数,但在getJSON函数之外,它包含null,在它内部,它包含正确的数据,甚至是变量 JSONfile 是全球宣布的(我认为是)。我是Javascript初学者。请解释一下这里发生了什么,或者给我指出类似的事情(我找不到自己) var atlasJSON=”http://127.0.0.1:8000/sprites/SPRITE.json"; var JSONfi

我正在尝试解析JSON。我正在使用

$getJSON
获取文件并将其内容保存到变量

JSONfile
,然后我将其传递给解析函数,但在getJSON函数之外,它包含null,在它内部,它包含正确的数据,甚至是变量

JSONfile
是全球宣布的(我认为是)。我是Javascript初学者。请解释一下这里发生了什么,或者给我指出类似的事情(我找不到自己)

var atlasJSON=”http://127.0.0.1:8000/sprites/SPRITE.json";
var JSONfile=null;
函数设置(){
body=document.getElementById('body');
canvas=document.createElement('canvas');
spriteManager=新SpriteSheetClass();
spriteManager.load(spritesheet);
$.getJSON(atlasJSON,函数(数据){
JSONfile=数据;
console.log(JSONfile);//JSON文件内容在这里
});
console.log(JSONfile);//null!!!
调试器;
parseAtlasDefinition(JSONfile);

对于(var i=0;i,您需要在回调中使用json

$.getJSON(atlasJSON, function(data) {
        JSONfile = data;
        console.log(JSONfile); // JSON file content is here

    console.log(JSONfile); // null !!!
    debugger;

    spriteManager.parseAtlasDefinition(JSONfile);

    for(var i=0; i<spriteManager.sprites.length ; i++){
        console.log(spriteManager.sprites[i]);    
    }

    //canvas = document.getElementById('canvas');
    ctx = canvas.getContext('2d');

    canvas.setAttribute('width', 1024);
    canvas.setAttribute('height',800);

    body.appendChild(canvas);
});
$.getJSON(atlasJSON,函数(数据){
JSONfile=数据;
console.log(JSONfile);//JSON文件内容在这里
console.log(JSONfile);//null!!!
调试器;
parseAtlasDefinition(JSONfile);

对于(var i=0;i$。getJSON是异步的,这意味着当您调用:

$.getJSON(atlasJSON, function(data) {
        JSONfile = data;
        console.log(JSONfile); // JSON file content is here
    });
然后

这是预期的行为。JSON只有在调用函数(数据)时才可用

发生的情况是,函数getJSON不会阻止代码执行。 它将通过网络向服务器发送请求,并等待返回数据。该代码现在将继续在下一行代码(在您的情况下为console.log)上执行,以此类推,直到接收到来自远程服务器的数据。一旦完全接收到这些数据,它将调用该函数

函数返回后,您可以在函数中执行的操作是将JSON分配给一个全局变量,这样您就可以在代码ie中的任何位置访问它

var JSONData = null;

然后,一旦调用函数(数据),将其分配给变量。这样(并且只有调用函数(数据)一次)所有JavaScript代码都可以使用它。

您还需要将变量解析到函数中

var JSONfile = null;

function setup(JSONfile){

    body = document.getElementById('body');
    canvas = document.createElement('canvas');

$.getJSON是异步的。我刚刚再次发现,这是这个问题的另一个重复问题。顺便说一句,这不完全是重复的..对ajax的误解相同,但与你们标记的重复问题不完全相同…这不能解释发生了什么..同意-没有范围错误-这是设计的。异步call从服务器请求数据,函数中的内容只在响应中可用。“null!!!”代码在json有机会从服务器返回之前触发,这意味着您尚未将数据分配给该变量。有意义吗?抱歉..不是null,未定义,还是一样..当我在chrome控制台中使用“console.log”打印它时,它的值是“null”,chrome也识别未定义,所以它是null,未定义。@Benjamin Grunbaum,1)我没有投任何战略性的否决票。事实上,我很多次都是先投票给那些回答我的人。2)我的答案因为别人的策略而被否决了很多次。3)我知道null和undefined不是一回事,null是用null值定义的。4)我不是小人物,如果你生气了,我很抱歉,我只是想在这种情况下,undefined和undefined没有多大区别,这仍然是同一个问题,你同意吗?@Benjamin Grunbaum我只是不确定你为什么投票反对我?w因为我的回答不好?
var JSONData = null;
var JSONfile = null;

function setup(JSONfile){

    body = document.getElementById('body');
    canvas = document.createElement('canvas');