我正试图通过这样的方式维护对象的状态:
obj = function() {
this.foo = undefined;
this.changeState = function () {
(function () { this.foo = "bar" })(); // This is contrived, but same idea.
};
};
我想在调用changeState方法时将实例变量foo设置为“bar”。
例如:
o = new obj();
o.changeState();
alert(o.foo); // This should say "bar"
据我所知,发生的事情是内部匿名函数中的“this”指向窗口。我不确定发生了什么。
我是否在正确的轨道上?有更好的方法吗?
答案 0 :(得分:3)
这个话题出现了很多,但由于从搜索结果中删除了“this”,因此很难搜索。
基本上,在JavaScript中,this
始终引用调用对象,而不是上下文对象。从这里我们从全局范围调用o.changeState(),this
引用窗口。
在这种情况下,你实际上不需要闭包的内部函数 - changeState
函数本身足以关闭词法范围。
obj = function()
{
var self = this;
this.foo = undefined;
this.changeState = function()
{
self.foo = "bar";
}
}
答案 1 :(得分:2)
除非在调用函数时指定此上下文,否则默认为全局(在浏览器中为窗口)。
替代方案是: -
obj = function() {
this.foo = undefined;
this.changeState = function () {
(function () { this.foo = "bar" }).call(this); // This is contrived, but same idea.
};
};
或: -
obj = function() {
var self = this;
this.foo = undefined;
this.changeState = function () {
(function () { self.foo = "bar" })(); // This is contrived, but same idea.
};
};
答案 2 :(得分:2)
function obj() {
this.foo = undefined;
this.changeState = function () { this.foo = "bar" };
};
var o = new obj();
o.changeState();
alert(o.foo);
适合我。我不确定为什么你只想使用自调用函数来分配函数引用,也不知道为什么你使用函数表达式来构造函数而不是函数声明。
答案 3 :(得分:1)
我明白了。只需要保存对当前上下文的引用并在内部匿名函数中使用它:
obj = function() {
this.foo = undefined;
var self = this;
this.changeState = function () {
(function () { self.foo = "bar" })();
};
};