【问题标题】:Javascript variable scope not working [duplicate]Javascript变量范围不起作用[重复]
【发布时间】:2013-05-21 20:03:21
【问题描述】:

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

$getJSON

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

JSONfile

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

JSONfile

是全局声明的(我认为是)。我是 Javascript 初学者。请解释这里发生了什么或指出类似的事情(找不到自己)。

var atlasJSON = "http://127.0.0.1:8000/sprites/SPRITE.json";
var JSONfile = null;

function setup(){

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

    spriteManager = new SpriteSheetClass();
    spriteManager.load(spritesheet);


    $.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);
};

【问题讨论】:

标签: javascript jquery scope


【解决方案1】:

$.getJSON 是异步的,这意味着当你调用时:

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

然后

console.log(JSONfile); // JSONfile is null...

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

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

你可以在你的函数中做什么,一旦它返回,就是将 JSON 分配给一个全局变量,这样你就可以在代码中的任何地方访问它,即。

var JSONData = null;

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

【讨论】:

  • 同意 - 没有范围错误 - 这是设计使然。异步调用从服务器请求数据,函数内的内容仅在响应中可用。 “空!!!​​”代码在 json 有机会从服务器返回之前触发,这意味着您尚未将数据分配给该变量。有意义吗?
  • 对不起..不是空的,未定义的,还是一样的..
  • 当我使用“console.log”在 chrome 控制台中打印它时,它的值为“null”,并且 chrome 也可以识别 undefined,所以它是 null,而不是 undefined。
  • @Benjamin Gruenbaum,1)我没有做任何战略性的否决票。我实际上多次投票给在我之前回答的人。 2)由于其他人的策略,我的答案多次被否决。 3)我知道null和undefined不是一回事,null是用null值定义的。 4)我不是小人,如果你冒犯了我很抱歉,我只是说在这种情况下, undefined 或 null 没有太大的区别,它仍然是同一个问题,不会你同意吗?
  • @Benjamin Gruenbaum 我只是不确定你为什么不投票给我?我的回答不对吗?
【解决方案2】:

您需要在回调中使用 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);
});

【讨论】:

  • 这并不能解释发生了什么......
【解决方案3】:

你还需要把变量解析成函数

var JSONfile = null;

function setup(JSONfile){

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

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2014-03-28
    • 2021-12-04
    相关资源
    最近更新 更多