Javascript 心灵扭曲暗示了这个.var访问 输出:

Javascript 心灵扭曲暗示了这个.var访问 输出:,javascript,Javascript,请解释为什么此代码只打印一次错误,然后再打印酷 为什么v1没有这个首先会起作用呢?第二次调用f1()没有bind()-其中这个隐式地是窗口,分配全局变量v1(或窗口.v1)到'cool',这是之后打印的值。首先,您记录的不是这个.v1,而是v1。这是对应该在窗口上定义的全局v1变量的引用。每次登录时不是x.v1,而是window.v1 此在没有限定范围的函数中指的是全局窗口。所以当你第一次调用它时,v1是在x上创建的,但是当你第二次调用它时,它是在窗口中创建的 为什么不使用这个关键字就可以使用v

请解释为什么此代码只打印一次
错误
,然后再打印


为什么
v1
没有
这个
首先会起作用呢?

第二次调用
f1()
没有
bind()
-其中
这个
隐式地是
窗口
,分配全局变量
v1
(或
窗口.v1
)到
'cool'
,这是之后打印的值。

首先,您记录的不是
这个.v1
,而是
v1
。这是对应该在
窗口
上定义的全局
v1
变量的引用。每次登录时不是
x.v1
,而是
window.v1

在没有限定范围的函数中指的是全局
窗口
。所以当你第一次调用它时,
v1
是在
x
上创建的,但是当你第二次调用它时,它是在
窗口中创建的

为什么不使用这个关键字就可以使用v1

因为您的“this”关键字将绑定到“window”对象,这是特殊的。 对于窗口,变量对象与其“this”对象/上下文相同

简单地说,window对象上的变量和属性是相同的

下面是来自ECMA-262的示例

error
v1: cool
v1: cool
v1: cool

因为在对f1的第二次调用中,
等于
窗口
或全局对象,因此现在
v1
是一个全局变量
error
v1: cool
v1: cool
v1: cool
var a = new String('test');

alert(a); // directly, is found in VO(globalContext): "test"

alert(window['a']); // indirectly via global === VO(globalContext): "test"
alert(a === this.a); // true

var aKey = 'a';
alert(window[aKey]); // indirectly, with dynamic property name: "test"