此问题已在此处有答案:
Self-references in object literals / initializers(32个回答)
2天前关闭。
假设我有两个对象
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属性,而第二个可以?我真的很困惑。
3条答案
按热度按时间hujrc8aj1#
答案取决于
this
在每个上下文中指的是什么。在JavaScript中,this
被绑定到当前函数被调用时点(.)左边的任何对象。如果我们不在函数中,事情会变得有点模糊--this
要么是全局window
对象,要么是undefined
,这取决于环境。在第一个示例中,
this
的值取决于周围的上下文。当JavaScript构建对象a
时,它会计算this.b
。无论this
当前绑定到什么对象,都没有b
属性,因此c
属性被设置为undefined
。在第二个示例中,当调用
funcObj.c()
时,函数中的this
被绑定到funcObj
。因此,当您请求b
属性时,您将获得上面定义的b
。funcObj.b
是一个函数的事实实际上是无关紧要的。以下方法同样有效:aydmsdu92#
您不能在声明中引用其他属性作为JavaScript文本声明的一部分。所以,在你的JavaScript文本声明中:
this
没有被设置为你想要的,a
还没有被初始化,所以你也不能引用它。在字面量声明时根本没有办法到达其他属性。这是当前JavaScript规范的一个限制。你可以这样做:因为
a
在那一点上完全形成了,所以你可以引用其中的其他属性。或者,在现代浏览器中,您甚至可以使用getter来获取
b
的“live”版本(这与您要求的功能不完全相同,因为它是b
的“live”版本,将跟踪它的值),但向您展示了另一种可能性:在第二个例子中:
您正在调用
funcObj.c()
,这将把c
内部的this
的值设置为funcObj
,因此您可以通过this
引用其他属性。这里的主要区别是
this
没有被设置为JavaScript字面量定义中的对象(第一个例子),但是当你像funcObj.c()
那样调用一个方法时,this
被设置为对象。sz81bmfz3#
我知道这篇文章有点旧,但我在试图解决类似问题时遇到了它。
我想做的是:
(That与我实际在做的相比,这是非常简化的,但原理是一样的。)
我的解决方案是首先创建一个函数,它将构建我想要的对象,然后传入我试图操作的主值(在这个例子中,是'a'中的值):
然后:
一旦x被初始化,任何后续访问
的尝试
或
将返回存储在其中的值。
如果将来的开发人员遇到这个问题,因为他们想要对存储在同一对象内的嵌套键中的值进行操作,希望这会有所帮助。