2011-05-27 53 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