[英]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);
我不明白的是
為什么this
賦予了新的特性?
為什么即使我從不提供任何字符串值,該值還是一個字符串?
另外,為什么在瀏覽器中有所不同? (如果沒有給出自我解釋,則給出答案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.