簡體   English   中英

在全局“ this”對象上使用“ for in”循環的奇怪行為

[英]Strange behavior using “for in” loop on global “this” object

有人可以解釋一下this對象在全局循環中導致此奇怪行為的原因嗎?

在全球范圍內

for(var key in this) key;

結果是, this獲取被分配了一個具有值"key"的新屬性key

這發生在nodejs和rhino js引擎中,但是在瀏覽器中結果是- window被分配了一個新的屬性key ,其值是"dispatchEvent"

我以為直接在控制台中鍵入會產生一些副作用,但是如果您在不帶此命令的控制台的腳本中運行它,效果也會相同。

$ node -e "for (var key in this) key; process.stdout.write(this.key + '\n')"

然后我認為這與for循環的主體只是key; 但是當你做同樣的事情

for (var key in this) console.log(key);

我不明白的是

  1. 為什么this賦予了新的特性?

  2. 為什么即使我從不提供任何字符串值,該值還是一個字符串?

  3. 另外,為什么在瀏覽器中有所不同? (如果沒有給出自我解釋,則給出答案1和2)

為什么要賦予它新的屬性?

var key // == this.key in the global scope.

因為this是全球范圍內, window瀏覽器, global中的NodeJS,當你在全球范圍內將被加入到全局范圍內聲明一個變量,它的意義。

為什么即使我從不提供任何字符串值,該值還是一個字符串?

因為for ... in枚舉對象的可枚舉屬性名稱作為字符串。 現在,您正在獲取dispatchEvent因為它是其中的最后一個枚舉屬性。

另外,為什么在瀏覽器中有所不同? (如果沒有給出自我解釋,則給出答案1和2)

在瀏覽器中有何不同? 瀏覽器的行為完全相同,

打開控制台,嘗試var foo="bar" ,然后輸入console.log(this.foo)

因為JavaScript沒有塊范圍,所以它具有函數范圍。 因此,表達式var key將在global范圍內聲明,因為您正在其中執行。

並且它獲得值"dispatchEvent"因為它是全局this的最后一個迭代的屬性名稱。

例如,在瀏覽器控制台中嘗試以下操作:

for (var key in window.location) 
    console.log(key);

最后一個枚舉的屬性將是"reload" ,因此變量key將是global變量,並且其值將是"reload"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM