2011-05-27 58 views
4

我在一些代码中有一个$ .getJSON调用,它似乎没有更新全局变量,我不知道为什么。 JSON数据正在加载OK,但出于某种原因,全局EventOptions数组未在for {}循环中更新。大写的注释涉及变量。有任何想法吗?谢谢Javascript匿名函数没有更新全局变量

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 
} 
+1

是在该函数之外声明的EventOptions? – Fosco 2011-05-27 14:30:34

回答

2

您的EventOptions[]不是全局可见的。我的猜测是,它应该仍然可以在您本地的$ .getJSON调用中看到;但因为现在作用域jQuery的,它清楚地遮蔽(你alert(EventOptions);您的匿名函数内部测试?

要正常范围,只是其声明的LoadMeasureTypes()之外。

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

-update

如果这不起作用 - 你总是可以拉匿名函数$ .getJSON(外)并为其分配一个变量名:

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

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

谢谢,但是,是的,EventOptions是全局声明的,并且警报DOES会正确报告e.measure_type。尝试了window.EventOptions(感谢pap),但这也不起作用。无所事事,它看起来好像该匿名函数中该死的EventOptions变量拒绝全局! – Pete 2011-05-27 15:14:41

+0

我不是故意提醒(e.measure_type),因为你指出这是工作。我的意思是改变(EventOptions),以确定在anon函数内的范围。这也可能是浏览器的一个问题 - 我知道IE和FF/Chrome以不同的方式处理作用域(在匿名函数中追踪“this”关键字 - IE引用窗口,而ff/chrome引用函数本身。 ) – Bosworth99 2011-05-27 15:23:03

1
window.EventOptions = ["..."] 

良好的“醇”黑客“把东西放在全球范围内

+0

更多的涂鸦:无论我做什么我都无法识别匿名函数中的全局变量,尽管数据肯定是在匿名代码块中更新的。啊,回到重绘设计我正在做淘气的JavaScript的绘图板。 – Pete 2011-05-27 15:22:01

1

得到了答案:好样的。它不能在iTouch Safari上运行,但在Firefox(Mac)上很好。博斯沃思我认为这是你上面提到的浏览器问题。有趣的是,这可能与线程有关。它出现out循环在内部匿名循环完成之前运行(警报不按顺序!)。我没有想到JavaScript使用这种线程,但我可能是错的。

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

谢谢你们。

+0

浏览器不一致性受损。坏。很高兴你把事情解决了。 – Bosworth99 2011-05-27 15:32:57