心灵扭曲暗示this.var访问

时间:2015-05-31 09:12:16

标签: javascript

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的情况下首先会工作?

3 个答案:

答案 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上创建。