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)的答案

    在浏览器中有什么不同?浏览器具有完全相同的行为

    打开控制台,尝试var
    foo=“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 crap
    var key
    为什么我没有看到它呢!谢谢+1:“枚举对象可枚举属性为字符串”您的意思是“对象属性名称为字符串”。-)啊,所以
    dispatchEvent
    可能是在循环开始之后和结束之前在内部分配的。。可能与打印到控制台有关。该死的废话
    var key
    为什么我没看到呢!谢谢+1:“枚举对象可枚举属性为字符串”您的意思是“对象属性名称为字符串”。-)啊,所以
    dispatchEvent
    可能是在循环开始之后和结束之前在内部分配的。。可能与打印到控制台有关。