用';这';在javascript中
假设我有两个对象,比如用';这';在javascript中,javascript,object,Javascript,Object,假设我有两个对象,比如 var a = { b: 1, c: this.b }; 及 把这两个像 console.log(a.c)//results undefined console.log(funcObj.c()) //results 1 为什么第一个函数不能使用this属性,而第二个函数可以? 我真的很困惑。答案取决于在每个上下文中所指的内容。在JavaScript中,这个绑定到调用当前函数时点(.)左边的任何对象。如果我们不在函数中,事情会变得更复杂--此是全局窗口对
var a = {
b: 1,
c: this.b
};
及
把这两个像
console.log(a.c)//results undefined
console.log(funcObj.c()) //results 1
为什么第一个函数不能使用this属性,而第二个函数可以?
我真的很困惑。答案取决于
在每个上下文中所指的内容。在JavaScript中,这个
绑定到调用当前函数时点(.)左边的任何对象。如果我们不在函数中,事情会变得更复杂--此
是全局窗口
对象或未定义
,具体取决于环境
在第一个示例中,this
的值取决于周围的上下文。当JavaScript构建对象a
时,它会计算this.b
。此
当前绑定到的任何对象都没有b
属性,因此c
属性设置为未定义
在第二个示例中,当调用funcObj.c()
时,函数中的this
将绑定到funcObj
。因此,当您请求b
属性时,您会得到上面定义的b
。事实上,funcObj.b
是一个函数并不重要。以下措施也同样有效:
var funcObj = {
b : 1,
c: function() {
console.log(return this.b)
}
}
不能将声明中的其他属性作为Javascript文字声明的一部分引用。因此,在Javascript文字声明中:
var a = {
b: 1,
c: this.b
};
此
未设置为您想要的,并且a
尚未初始化,因此您也无法引用它。在进行文字声明时,根本无法访问其他属性。这是当前Javascript规范的一个限制。您可以这样做:
var a = {
b: 1
};
a.c = a.b;
因为a
在该点完全成形,所以您可以引用其中的其他属性
或者,在现代浏览器中,您甚至可以使用getter获得像这样的
b
的“实时”版本(这与您所要求的功能并不完全相同,因为它是b
的“实时”版本,可以跟踪其值),但它向您展示了另一种可能性:
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()
,这会将c
内部的this
的值设置为funcObj
,因此您可以通过this
引用其他属性
这里的主要区别在于,
this
未设置为Javascript文字定义(第一个示例)中的对象,但是this
在调用funcObj.c()
中的方法时设置为对象,因为第一个示例显示了对象文字,没有函数作用域。我想你的意思是写a.c=a.b代码>在第二个示例中。@ChrisBouchard-yes。现在修好了。
var funcObj = {
b : function() {
return 1;
},
c: function() {
console.log(return this.b())
}
}
console.log(funcObj.c()) //results 1