getJSON范围和变量定义

时间:2015-09-09 00:44:07

标签: jquery json getjson

我无法理解为什么我的代码运行不正常。也就是说,我对函数运行后foo.barundefined的原因感到困惑,但是在函数中定义了。

function async(foo, n) {

  console.log("getting value number: " + n);

  $.getJSON("database.json", function(data) {
    foo.bar = data.value[n];
    console.log(foo.bar); // this works
  });
}

//////////////////////////////////////////////////////////

var foo = new String();

async(foo, 0);

console.log(foo.bar); // doesn't work

控制台输出以下内容:

>getting stop number: 0
>undefined
>defined

2 个答案:

答案 0 :(得分:1)

$.getJSON将异步运行回调。也就是说它是非阻塞的,并且只会在收到响应之后运行回调,这是在所有其他代码运行之后。

答案 1 :(得分:0)

<强>更新

function async(foo, n) {
        // «foo» is a parameter that only exists in the context of the function «async()», the same way for «n».

        console.log("getting value number: " + n);

        $.getJSON( "database.json", function(data) {
        // Dynamically, the Javascript engine foo is interpreted as an object, because your result is an object with a specific value.
            foo.bar = data.value[n];
        // You're overwriting foo parameter with the new result. (data.value[n]).

        // Then
            console.log(foo.bar);    // this works!
        });
}

var foo = new String();

foo 是String的原始对象。

当你这样做时:

console.log(foo);

你在控制台中得到这个:

String {length: 0, [[PrimitiveValue]]: ""}

在这一行:

async(foo, 0);

您正在使用String的原始对象和«0»作为参数调用异步函数。

使用正确的解决方案进行了更新:

  

默认情况下,变量的最终值取决于   异步或同步请求,将与完成   请求完成时的期望值。这取决于   来自服务器的响应。

     

您需要等待服务器的响应来分配变量   用最终值然后显示它。

你应该试试这个:

var foo = {}; // Declare an object.
foo.bar; // Add bar attribute in this object.


function async(n) {
    console.log("getting value number: " + n);

    $.getJSON("database.json", function (data) {
        foo.bar = data.value[n]; // foo.bar has a new value from the Asynchronous request.
        printResult(); // Call printResult function to print in the console.
    });
}

function printResult() {
    console.log(foo.bar);
}


// Execute async function.
async(0);

Demo