给出以下JavaScript代码:
({
foo: 1,
bar: 2,
zoo: 3,
test: function(i) {
var g = function(i) {
alert(i + zoo);
}
g(i);
}
}).test(2);
为什么zoo
中alert()
未定义?我可以使用哪种语法正确引用zoo
并获取值5
的警报显示?
更新:我更倾向于解决方案,只有g
的实施需要改变,如果可能的话。
答案 0 :(得分:3)
使用箭头功能保存"外部"值this
,并使用它来访问zoo
属性的值:
({
foo: 1,
bar: 2,
zoo: 3,
test: function(i) {
var g = i => alert(i + this.zoo);
g(i);
}
}).test(2);
答案 1 :(得分:1)
zoo
不是自由浮动变量,它是对象的属性。在test
内,您可以使用this
引用该对象(因为您调用它的方式)。在g
内部,this
上下文会丢失,因此您需要明确保留它:
test: function(i) {
var g = function(i) {
alert(i + this.zoo);
}.bind(this);
g(i);
}
或:
test: function(i) {
var g = function(i) {
alert(i + this.zoo);
};
g.call(this, i);
}
答案 2 :(得分:1)
当您调用对象的成员函数时,this
关键字将设置为该对象(除非您使用.call
或.apply
调用该函数)。函数g
不再是对象的成员,因此this
未设置为对象。如果您想继续使用g
功能,可以选择几种方法。
设置对this
:
test: function(i) {
var that = this;
var g = function(i) {
alert(i + that.zoo);
}
g(i);
}
或使用this
.call
的值
test: function(i) {
var g = function(i) {
alert(i + this.zoo);
}
g.call(this, i);
}
答案 3 :(得分:0)
怎么样:
({
foo: 1,
bar: 2,
zoo: 3,
test: function(i) {
var g = function(_this,i) {
alert(i + _this.zoo);
}
g(this,i);
}
}).test(2);