x = {}
function f1 () {
this.v1 = 'cool'
try { console.log('v1:', v1) } catch(e){ console.log('error') }
}
f1.bind(x)()
f1()
f1.bind(x)()
f1()
error
v1: cool
v1: cool
v1: cool
请解释为什么此代码会打印error
一次,然后cool
。
为什么v1
在没有this
的情况下首先会工作?
答案 0 :(得分:1)
第二次拨打f1()
时没有bind()
- 其中this
隐含window
,分配全局变量v1
(或window.v1
)至'cool'
,这是此后打印的值。
答案 1 :(得分:1)
有趣的问题。
为什么不使用没有此关键字的v1?
因为你的"这个"关键字将绑定到" window"对象,这很特别。 在窗口的情况下,变量对象与其#34相同;这个"对象/上下文。
简单地说,window对象上的变量和属性是同一个。
下面是ECMA-262的一个例子。
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"
答案 2 :(得分:0)
首先,您不是this.v1
,而只是v1
。这是对应该在v1
上定义的全局window
变量的引用。每次登录时都不是x.v1
,而是window.v1
。
this
指的是全局window
。因此,当您第一次呼叫时,v1
会在x
上创建,但是当您第二次呼叫时,会在window
上创建。