我们说我有两个对象,比如
var a = {
b: 1,
c: this.b
};
并且
var funcObj = {
b : function() {
return 1;
},
c: function() {
console.log(return this.b())
}
}
记录这两个像
console.log(a.c)//results undefined
console.log(funcObj.c()) //results 1
为什么第一个函数不能使用this属性,但第二个函数可以使用? 我真的很困惑。
答案 0 :(得分:3)
答案取决于每个上下文中this
引用的内容。在JavaScript中,当调用当前函数时,this
绑定到点(。)左侧的任何对象。如果我们不在某个功能中,事情就会变得更加毛躁 - this
可以是全局window
对象,也可以是undefined
,具体取决于环境。
在您的第一个示例中,this
的值取决于周围的上下文。当JavaScript构建您的对象a
时,它会评估this.b
。当前绑定的任何对象this
没有b
属性,因此c
属性设置为undefined
。
在第二个示例中,当您致电funcObj.c()
时,函数中的this
将绑定到funcObj
。因此,当您要求b
属性时,您将获得上面定义的b
。 funcObj.b
是一个函数的事实实际上是无关紧要的。以下也适用:
var funcObj = {
b : 1,
c: function() {
console.log(return this.b)
}
}
答案 1 :(得分:2)
您不能将声明中的其他属性作为Javascript文字声明的一部分引用。所以,在你的Javascript文字声明中:
var a = {
b: 1,
c: this.b
};
this
未设置为您想要的内容且a
尚未初始化,因此您也无法引用它。在文字声明时根本没有办法到达其他属性。这是Javascript当前规范的限制。你可以这样做:
var a = {
b: 1
};
a.c = a.b;
因为此时a
已完全形成,因此您可以引用其中的其他属性。
或者,在现代浏览器中,您甚至可以使用getter来获取" live"像这样的b
版本(它不是与您要求的完全相同的功能,因为它是{"生活"版本的b
将跟踪它& #39; s值),但显示了另一种可能性:
var a = {
b: 1,
get c() {
return b;
}
};
console.log(a.c); //results 1
在你的第二个例子中:
var funcObj = {
b : function() {
return 1;
},
c: function() {
console.log(return this.b())
}
}
console.log(funcObj.c()) //results 1
您正在调用funcObj.c()
并将this
内的c
值设置为funcObj
,因此您可以通过this
引用其他属性。
这里的主要区别是this
未设置为Javascript文字定义(第一个示例)中的对象,但在调用方法时this
设置为对象{ {1}}。