2011-07-08 92 views
1

奇怪!js範圍和財產枚舉

我正在爲使用javascript的Moodle插件工作。我不是js的專家,只是開始。我有一個對象的功能中的一些調試代碼,這是獲得所謂:

console.log(M.core_filepicker.instances); 
    for (var clientid in M.core_filepicker.instances) { 
     console.log(M.core_filepicker.instances[clientid]); 
    } 

的執行console.log位輸出這樣的:

Object 
4e16f16a0dc14: FilePickerHelper 
4e16f16a1837e: FilePickerHelper 
4e16f16a03933: FilePickerHelper 
4e16f169cd12c: FilePickerHelper 
4e16f169d70e0: FilePickerHelper 
4e16f169e2466: FilePickerHelper 
4e16f169ed42e: FilePickerHelper 

一個「對象」與屬性鍵4E16 ...等以及FilePickerHelper類型的這些屬性的值。

但for循環不運行。

有趣的是,它在其他範圍內運行並遍歷屬性。在我的瀏覽器的調試控制檯或其他功能。我不明白爲什麼會這樣。

傑米

+0

你確定'Object'不是第'log'語句的打印輸出和'FilePickerHelper's來自循環?只需在循環內添加一個alert('hey')'來確保。 –

+0

是的,我確定FilePickerHelpers是由第一個日誌調用輸出的。 – jamiep

+0

如果你的對象看起來像這樣會很有趣:'{prop:「4e16f16a0dc14:FilePickerHelper」,prop2:「4e16f16a1837e:FilePickerHelper」,etc}' – Lapple

回答

0

我繼續玩味的這個問題,並解決了發生了什麼事希望正確位置:http://moodle.org/mod/forum/discuss.php?d=180893

+0

請擴大您在這裏發現的內容,並可能接受您的答案,如果您認爲它是正確的 –

+0

我發現在Firefox和Chrome中都是如此,但Chrome console.log中的更多內容在用於具有大量封閉和範圍鏈。似乎console.log並不總是顯示調用時傳遞給它的變量的值,它有時會在稍後顯示值。例如在Chrome中嘗試: 'test = {}; console.log(test); test.hello1 =「hello」; (函數(){ console.log(test); })();' – jamiep

+0

看起來,使用斷點停止代碼在感興趣的點然後查看變量的內容是可靠的。 – jamiep

0
for (var i = 0; i < myArray.length; i++) 

for (var i in myArray) 

是不同的結構。在我看來,你的循環內的代碼會更喜歡第一種類型的for。

是什麼

for (var instance in M.core_filepicker.instances) { 
     console.log(instance); 
    } 

給你?

(詩知道的hasOwnProperty()如果​​在做。)

+0

'for(var.class_filepicker.instances中的實例){ console.log(instance); }' 當在控制檯中運行,得出: '4e16f169cd12c 4e16f169d70e0 4e16f169e2466 4e16f169ed42e 4e16f16a03933 4e16f16a0dc14 4e16f16a1837e' – jamiep

+0

但奇怪的是,當我提出,在功能,我想在它使用它輸出什麼都沒有,儘管console.log(M.core_filepicker.instances);在同一地點使用時輸出7個屬性。 – jamiep

0

你的for循環輸出正確的屬性,但以任意順序。在Javascript中,迭代屬性不會指定順序。

+0

不,for循環不運行。它是你所看到的第一行的輸出。 – jamiep