Javascript构造函数中的引用实例变量

时间:2009-09-08 16:27:17

标签: javascript oop closures anonymous-function

我正试图通过这样的方式维护对象的状态:

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”指向窗口。我不确定发生了什么。

我是否在正确的轨道上?有更好的方法吗?

4 个答案:

答案 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" })();
    }; 
};