请考虑以下代码:
var obj = {
x: this
}
obj.x
原来是window
。我认为this
会引用obj
。
我不明白this
在上述情况下是如何运作的。即使使用JavaScript等后期绑定,也不应该x
引用obj
对象?我理解this
的所有其他情况,其值取决于代码中的调用方式。有人可以帮我理解this
的这种行为吗?
答案 0 :(得分:0)
window
是this
的默认值。如下面的评论中所述,如果this
生效,'use strict';
将被取消定义。
this
的值会根据它所在的对象而改变。
示例:
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中函数的原因是没有对该对象的访问权。
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
对象。
关于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
之间存在差异时我的,是谁调用它们,它正式被称为当前执行上下文。