Javascript 奇怪的行为使用;在「;“全球循环”;这";对象
有人能解释一下是什么导致了全局Javascript 奇怪的行为使用;在「;“全球循环”;这";对象,javascript,Javascript,有人能解释一下是什么导致了全局this对象上for-in循环的这种奇怪行为吗 在全球空间中,做什么 for(var key in this) key; 结果是,thisgets被分配了一个新属性key,该属性具有值“key” 这在nodejs和rhino js引擎中发生,但在浏览器中,结果是,窗口被分配了一个新属性键,该属性的值为“dispatchEvent” 我认为这是直接在控制台中键入的一些副作用,但如果您在没有控制台的脚本中使用此命令运行它,情况也是如此 $ node -e "for (
this
对象上for-in循环的这种奇怪行为吗
在全球空间中,做什么
for(var key in this) key;
结果是,this
gets被分配了一个新属性key
,该属性具有值“key”
这在nodejs和rhino js引擎中发生,但在浏览器中,结果是,窗口
被分配了一个新属性键
,该属性的值为“dispatchEvent”
我认为这是直接在控制台中键入的一些副作用,但如果您在没有控制台的脚本中使用此命令运行它,情况也是如此
$ node -e "for (var key in this) key; process.stdout.write(this.key + '\n')"
然后我认为这与for循环的主体只是键有关但是当你这样做的时候,同样的事情也会发生
for (var key in this) console.log(key);
我不明白的是
为什么此
被赋予一个新属性
为什么即使我从未给出任何字符串值,该值也是字符串
另外,为什么在浏览器中会有所不同?(如果不是自解释的,给出1和2的答案)
为什么这是一个新的属性
因为this
是全局范围,所以在浏览器中的window
,在nodejs中的global
,当您在全局范围中声明变量时,它将被添加到全局范围中,这是非常有意义的
为什么即使我从未给出任何字符串值,该值也是字符串
因为。。。在
中,将对象可枚举属性名称枚举为字符串。
现在您得到的是dispatchEvent
,因为它是本文档中最后一个枚举的属性
另外,为什么在浏览器中会有所不同?(如果不是不言自明的话)
(1和2)的答案
在浏览器中有什么不同?浏览器具有完全相同的行为
打开控制台,尝试varfoo=“bar”
,然后键入console.log(this.foo)
。您将得到bar
为什么这是一个新的属性
因为this
是全局范围,所以在浏览器中的window
,在nodejs中的global
,当您在全局范围中声明变量时,它将被添加到全局范围中,这是非常有意义的
为什么即使我从未给出任何字符串值,该值也是字符串
因为。。。在中,将对象可枚举属性名称枚举为字符串。
现在您得到的是dispatchEvent
,因为它是本文档中最后一个枚举的属性
另外,为什么在浏览器中会有所不同?(如果不是不言自明的话)
(1和2)的答案
在浏览器中有什么不同?浏览器具有完全相同的行为
打开控制台,尝试var
foo=“bar”
,然后键入console.log(this.foo)
。您将得到bar。因为JavaScript没有块作用域,所以它有函数作用域。因此表达式var key
将在global
范围内声明,因为您是在其中执行的
它得到值“dispatchEvent”
,因为它是全局此
中最后一个迭代的属性名
例如,在浏览器控制台中尝试以下操作:
for (var key in window.location)
console.log(key);
最后一个枚举的属性将是
“reload”
,因此变量key
将是全局
变量,它将具有值“reload”
,因为JavaScript没有块作用域,所以它具有函数作用域。因此表达式var key
将在global
范围内声明,因为您是在其中执行的
它得到值“dispatchEvent”
,因为它是全局此
中最后一个迭代的属性名
例如,在浏览器控制台中尝试以下操作:
for (var key in window.location)
console.log(key);
最后一个枚举的属性将是
“reload”
,因此变量key
将是global
变量,它的值将是“reload”Holy crapvar key
为什么我没有看到它呢!谢谢+1:“枚举对象可枚举属性为字符串”您的意思是“对象属性名称为字符串”。-)啊,所以dispatchEvent
可能是在循环开始之后和结束之前在内部分配的。。可能与打印到控制台有关。该死的废话var key
为什么我没看到呢!谢谢+1:“枚举对象可枚举属性为字符串”您的意思是“对象属性名称为字符串”。-)啊,所以dispatchEvent
可能是在循环开始之后和结束之前在内部分配的。。可能与打印到控制台有关。