2012-04-15 124 views
2

我想知道如何使用功能访问“南”电子可变的JavaScript物件,像这样:Javascript变量作用域。如何从内部对象函数访问对象变量?

function myObj() { 
    this.vars = { 
     name: 'bob', 
     age: '42' 
    } 
    this.functions = { 
     sayName: function() { 
      alert(this.vars.name); 
     } 
    } 
} 

var obj = new myObj(); 
obj.functions.sayName(); 

缺少什么我在这里?

我能得到的名称VAR如果我通过到自身的引用,如:

function myObj() { 
    this.vars = { 
     name: 'bob', 
     age: '42' 
    } 
    this.functions = { 
     sayName: function(name) { 
      alert(name); 
     } 
    } 
} 

var obj = new myObj(); 
obj.functions.sayName(obj.vars.name); 

,但似乎有点多余...想法?

回答

5

的问题是,在你的函数this.functions.sayName,该this关键字是指this.functions,而不是当前对象。

下面是该问题的解决办法:

function myObj() { 
    var vars = this.vars = { 
     name: 'bob', 
     age: '42' 
    } 
    this.functions = { 
     sayName: function() { 
      alert(vars.name); 
     } 
    } 
} 

var obj = new myObj(); 
obj.functions.sayName(); 

这将创建的myObj内的局部变量,你可以从任何内部范围访问。这也暴露了该变量对外部世界为任一属性实例化myObj类,这意味着你仍然可以做这样的事情

obj.vars.name = 'test'; 

,它仍然会改变对象的内部状态。这可能是您当前设置的最佳解决方案。

JavaScript中关键字this的行为很有趣。我推荐Mozilla开发者网络上的优秀writeup

+0

真棒的答案。我确实需要保持外部组件可访问的变量,因此添加this.vars =是关键。谢谢! – 2012-04-15 01:15:11

1

你可以做这样的:如果

var thisObj = this; 
this.functions = { 
    sayName: function() { 
     alert(thisObj.vars.name); 
    } 
} 

不知道这是最好的解决办法,但它的工作原理。 Javascript 这个如果你在一个函数内,它总是指内部作用域。

1

只是删除this

function myObj() { 
    var vars = { 
     name: 'bob', 
     age: '42' 
    }; 
    this.functions = { 
     sayName: function() { 
      alert(vars.name); 
     } 
    }; 
}; 

var obj = new myObj(); 
obj.functions.sayName();​ 

LIVE DEMO

+1

这会创建一个隐式的全局变量,并将来自任何特定对象的'vars'对象解耦。如果你实例化另一个'myObj',你最终会有多个对象共享状态。 – Reid 2012-04-15 01:06:54

+0

@Reid。我有一个小错误,看看更新的小提琴。 – gdoron 2012-04-15 01:17:18