为什么这是一个对象窗口?

时间:2017-02-28 06:09:53

标签: javascript this

请考虑以下代码:

var obj = {
    x: this
}

obj.x原来是window。我认为this会引用obj

我不明白this在上述情况下是如何运作的。即使使用JavaScript等后期绑定,也不应该x引用obj对象?我理解this的所有其他情况,其值取决于代码中的调用方式。有人可以帮我理解this的这种行为吗?

2 个答案:

答案 0 :(得分:0)

如果您在浏览器中运行代码,则

windowthis的默认值。如下面的评论中所述,如果this生效,'use strict';将被取消定义。

this的值会根据它所在的对象而改变。

示例:

1

var test = {
  a: 1,
  b: function () {
    console.log(this.a)
  }
}

在这种情况下,this的值将是包含对象。

var test = {
  a: 1,
  b: function () {
    setTimeout(function () {console.log('surprise', this.a)}, 0)
  }
}

然而,这段代码并没有给出相同的结果。 在没有严格模式的情况下,在浏览器上,将通过a访问属性window

setTimeout中函数的原因是没有对该对象的访问权。

2

var someObject = {
  value: 1,
  someFunction () {
    return function () {
      console.log(this.value)
    }
  }
}

var displayValue = someObject.someFunction()
displayValue()

在这种情况下,this也是未定义的,因为this的值相对于包含被调用函数的对象发生了变化。

someFunction是对象someObject上的一个方法,因此this里面的值等于someObject,但someFunction返回的函数是没有被someObject调用,因此存在差异。

答案 1 :(得分:0)

这是指当前执行上下文,在这种情况下(初始)是window对象。

Check this out

更具体这个问题

关于this的一个重要原则是:

  在对象调用定义了的函数之前,

this未分配值。让我们调用函数,其中定义了“this Function。”

所以,我们假设你已经用这种方式定义了你的对象:

 var person = {
    firstName   :"John",
    lastName    :"Doe",
    showHometown:function () {
        console.log (this);
    }
 }

由于在this方法中使用了showHometown关键字,并且在person对象上定义了showHometown方法,因此this将具有person的值object,因为person对象将调用showHometown()

当你看到你定义的对象中的x之间存在差异时我的,是谁调用它们,它正式被称为当前执行上下文