2012-04-15 125 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