2011-07-17 6 views
5

Javascriptで次のコードを記述しました。Javascriptのクラスとスコープ

function main() 
{ 
    this.a ; 
    this.set = function() 
    { 
     a = 1; 
    } 
} 

var l = new main(); 

alert("Initial value of a is "+ l.a); 
l.set(); 
alert("after calling set() value of a is "+ l.a); 

どちらの場合でも、私はaの値が未定義です。なぜ、set()を呼び出した後でもaは未定義ですか?

答えて

2

のjavascriptこれまで:

function main() 
{ 
    this.a ; 
    this.set = function() 
    { 
     a = 1; 
    } 
} 

意志は前の回答に加えて

function main(); 

{ // starts unattached object literal 
    this.a ; 
    this.set = function(); 

    { // starts another unattached object literal 
     a = 1; // sets value to window.a 
    } 
} 
7

athis.aとする必要があります。

そうでなければ、(thisは、新たにバインドされますaはなく、オブジェクトのプロパティ(グローバル、本質的に、あなたはそれがwindowオブジェクト上aプロパティをしている省い、varを使用していた)ローカル変数aを参照しています作成されたオブジェクト)。

jsFiddle

+0

右: 'a = 1;と言うとき、あなたは' a'という名前のグローバル変数を宣言しています。 –

+0

@JustinEthier:乾杯、私はそれをもっと明示しました:) – alex

+0

ありがとうございます。私は今、Javascriptクラスの初心者です。私は今、変数の範囲を理解しています –

2

あなたの関数がthisへの参照が不足している "設定":

this.a = 1; 
1

のように見えます:Javascriptにクラスはなく、オブジェクトのみです。あなたはクラスのようなものを作ることができますが、javascriptの継承モデルはprototypalです。あなたのコードでは、mainconstructor functionで、そこからインスタンスを派生させることができます。

多くの人々が、古典的なOOPパターンのすべての種類に強制的にJavaScriptを強制しようとしています。それはまったく可能ですが、言語を危機にさらしています。表示するには時間をかけてくださいthis series of lectures

+0

+1誰もが知っている良い。 – alex

0

オブジェクトのプロパティを未定義として宣言することはできません。 caseメソッドでは、プロパティaが間違って参照されました。ここに修正があります:

function main() { 
    this.a = null; 
    this.set = function() { 
     this.a = 1; 
    } 
} 

var l = new main(); 

alert("Initial value of a is " + l.a); 
l.set(); 
alert("after calling set() value of a is " + l.a);