javascript里面变量的范围

时间:2010-04-19 05:41:13

标签: javascript jquery

我有以下代码示例,我试图包围我的脑袋

        $(document).ready(function () {

        test("load json", function () {

            length = 0; // length = 0

            $.getJSON("plugins/form.json", function (data) {
                length = data.fields.length; // length = 4
            });

            ok(length == 4, "length = " + length.toString()); // length = 0? wtf?
        });
    });

$ .getJSON运行时,'length'变量不会持久存在。我无法弄清楚它是否因为它的异步或因为变量超出了范围。

5 个答案:

答案 0 :(得分:3)

如果getJSON方法异步运行,则ok(...行可能会在getJSON返回之前执行...因此长度始终为0 ......

你能不能这样做......

$.getJSON("plugins/form.json", function (data) {  
   var somelength = data.fields.length;  
   ok(somelength == 4, "length = " + somelength.tostring());  
});

一旦getJSON返回数据,它就会调用ok函数...

答案 1 :(得分:2)

您应该进行异步测试,并且由于您使用的是QUnit,因此您可以使用stop方法,在getJSON回调中进行断言,然后恢复以下测试:

$(document).ready(function () {

    test("load json", function () {
        stop();

        $.getJSON("plugins/form.json", function (data) {
            var length = data.fields.length;
            ok(length == 4, "length == " + length);
            start(); // resume tests
        });
    });
});

或者您可以使用asyncTest方法代替test,这会隐式调用stop

//...
asyncTest("load json", function () {

    $.getJSON("plugins/form.json", function (data) {
        var length = data.fields.length;
        strictEqual(length, 4, "length"); 
        //...
        start(); // resume tests
    });
});
//...

查看实时示例here并查看源代码here

答案 2 :(得分:1)

这不是因为范围问题,而是因为此行首先运行

ok(length == 4, "length = " + length.toString());

来自JSON的回调函数

function (data) {
    length = data.fields.length; // length = 4
}

您需要将ok(length == 4, "length = " + length.toString());函数放在$.getJSON的回调函数中。

答案 3 :(得分:1)

是的,那是因为它是异步的。

test("load json", function () {

     // executes first

     $.getJSON("plugins/form.json", function (data) {

         // executes last (that is, "sometime later")

     });

     // executes second

});

此外,您应该首次将变量声明为var length,除非您希望它是全局变量。

答案 4 :(得分:-1)

试试这个 - $(document).ready(function(){

var length = 0; // length = 0
    test("load json", function () {

        $.getJSON("plugins/form.json", function (data) {
            length = data.fields.length; // length = 4
        });

        ok(length == 4, "length = " + length.toString()); // length = 0? wtf?
    });
});