考虑这个错误的代码:
x = {
y : "why",
z : function() {
return y + " zed";
}
}
函数z不起作用:“ReferenceError:y未定义”。
有没有办法从函数z中访问y而不将其完全指定为x.y?
我当然可以将其重写为
x = function() {
var self = this;
this.y = "why";
this.z = function() {
return self.y + " zed";
};
return this;
}();
......但是天哪。
答案 0 :(得分:3)
如果您使用this
调用该函数,只需使用x.z()
:
var x = {
y : "why",
z : function() {
return this.y + " zed";
}
};
答案 1 :(得分:0)
不,你需要重写它。 y
是该对象的属性,如果没有该对象,则无法访问它 - 不像从闭包中访问变量(例如,重写中的self
)。
当然,当您以x.z()
方式调用该函数时,this
keyword也将指向该对象,以便您可以将其写为
return this.y + " zed";
只要你总是在该对象的上下文中调用该函数。
答案 2 :(得分:0)
@VisioN有直截了当的答案。如果您重写代码,可能有助于可视化为什么这样做:
var x = {};
x.y = "why";
x.z = function() {return this.y + " zed"; };
alert(x.z());
这里y和z是对象的属性,但是没有函数闭包作用域。您需要“this”关键字才能访问父对象的属性。
可替换地,
var x = function () {
var y = "why";
var z = function () { return y + " zed?"; };
return z();
};
alert(x());
这通过访问y而不使用它来演示功能范围。在x
内,y
已知。外面,它不是。
答案 3 :(得分:0)
使用揭示模块模式:
var x = (function () {
y = "why";
z = function() {
return y + " zed";
};
return {
"y": y,
"z": z
};
})();
//now you can call:
x.y // "why"
x.z() // "why zed"