假设我有两个对象,例如
var a = {
b: 1,
c: this.b
};
Run Code Online (Sandbox Code Playgroud)
和
var funcObj = {
b : function() {
return 1;
},
c: function() {
console.log(return this.b())
}
}
Run Code Online (Sandbox Code Playgroud)
在记录这两个像
console.log(a.c)//results undefined
console.log(funcObj.c()) //results 1
Run Code Online (Sandbox Code Playgroud)
为什么第一个函数不能使用 this 属性而第二个函数可以?我真的很困惑。
答案取决于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)
}
}
Run Code Online (Sandbox Code Playgroud)
您不能在声明中引用其他属性作为 Javascript 文字声明的一部分。因此,在您的 Javascript 文字声明中:
var a = {
b: 1,
c: this.b
};
Run Code Online (Sandbox Code Playgroud)
this未设置为您想要的并且a尚未初始化,因此您也无法引用它。在文字声明时根本无法访问其他属性。这是当前 Javascript 规范的限制。你可以这样做:
var a = {
b: 1
};
a.c = a.b;
Run Code Online (Sandbox Code Playgroud)
因为a在那时完全形成,因此您可以引用其中的其他属性。
或者,在现代浏览器中,您甚至可以使用 getter 来获取这样的“实时”版本b(这与您要求的功能不完全相同,因为它是一个“实时”版本b,将跟踪它的价值) ,但向您展示了另一种可能性:
var a = {
b: 1,
get c() {
return b;
}
};
console.log(a.c); //results 1
Run Code Online (Sandbox Code Playgroud)
在你的第二个例子中:
var funcObj = {
b : function() {
return 1;
},
c: function() {
console.log(return this.b())
}
}
console.log(funcObj.c()) //results 1
Run Code Online (Sandbox Code Playgroud)
你在呼唤funcObj.c(),这将设定值this内c,以funcObj使这样就可以通过引用其他属性this。
这里的主要区别在于this它没有设置为 Javascript 文字定义内的对象(您的第一个示例),而是this在调用方法时设置为对象,如funcObj.c()。