Javascript匿名函数不更新全局变量

时间:2011-05-27 14:28:22

标签: javascript global-variables anonymous-function

我在一些看似没有更新全局变量的代码中有一个$ .getJSON调用,我很难理解为什么。正在加载JSON数据,但由于某种原因,for {}循环中没有更新全局EventOptions数组。大写注释引用变量。有任何想法吗?感谢

function LoadMeasurementTypes() {
    // Clear out EventOptions
    EventOptions = ["..."];
    // Push a couple on to EventOptions - THESE ADD OK
    EventOptions.push("Temperature");
    EventOptions.push("Pulse rate");
    // Call json to get measurementTypes off the table    
    $.getJSON('./get-measurement-types.php', function (measurementTypeData) {
        // Process each json element ([0].BP, [1].ph (Urine) etc.
        for (var i = 0; i < measurementTypeData.length; ++i) {
            // e is a storage variable to contain the current element
            var e = measurementTypeData[i];
            // Add the new measurement type
            alert(e.measure_type); // OK works - we can see the measure_type
            EventOptions.push(e.measure_type); // THESE ARE NOT BEING ADDED 
        }
    } // end anonymous function
    ) // end get json call
    EventOptions.push("Last one"); // THIS ONE IS BEING ADDED
}

3 个答案:

答案 0 :(得分:2)

您的EventOptions[]无法全局显示。我的猜测是它仍然应该在$ .getJSON调用的本地可见;但因为现在它的范围是jquery,它显然是模糊的(你在你的anon函数中alert(EventOptions);测试了吗?

要正确定位,只需将其声明在LoadMeasureTypes()之外。

var EventOptions = ["..."];
function LoadMeasureTypes(){...

-update

如果这不起作用 - 你总是可以在$ .getJSON()之外拉匿名函数,并为它赋一个变量名:

var retreiveTypes = function(){...};

$.getJSON("..path/php", retreiveTypes);

答案 1 :(得分:1)

window.EventOptions = ["..."]

很好'ol“hack”把东西放在全球范围内

答案 2 :(得分:1)

得到答案:好吧。它不适用于iTouch Safari,但在Firefox(Mac)上运行良好。博斯沃思我认为这是你上面提到的浏览器问题。 有趣的是,它可能与线程有关。看起来out循环在内部匿名循环完成之前运行(警报不按顺序!)。我不认为javascript会以这种方式使用线程,但我可能错了。

我现在怀疑整个问题是时间问题 - 新线程作为匿名函数未能及时完成。

谢谢你们。