2010-12-04 10 views
28

この3つのコンストラクタ関数与えられた:「VAR」JavaScriptで

function Foo(data) { 

    var _data = data; 

} 

function Bar(data) { 

    this.data = data; 

} 

function Baz(data) { 

    //just use data freely. 

} 

は、建設後dataメンバーの可視性とは別に、任意の違いはありますか? (たとえば、Bar().dataは新しくできますが、new Foo().dataは含まれません)

答えて

25

var _data = data;dataというローカルコピーが作成されます。 this.data = dataは実際にオブジェクト自体のプロパティを作成します。

私はこの(しゃれが意図していない)を読み取るをお勧めします:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

+2

注:ローカル変数には、パラメーターの値が割り当てられます。パラメータがオブジェクトへの参照である場合、ローカル変数もオブジェクトのコピーへの参照ではなく、同じオブジェクトへの参照になります。 – Guffa

+1

これは素晴らしい答えです(間違った意味があります) – Marty

27

をはい、違いは変数が格納されている方法です。

varで宣言された変数は、コンストラクタ関数に対してローカルです。スコープ内で宣言された関数があれば、コンストラクタ呼び出しを超えて生き残ります。関数が関数クロージャで捕捉されるためです。

this.で宣言された変数は、実際には変数ではなく、オブジェクトのプロパティであり、使用されているかどうかにかかわらずオブジェクトが存続する限り存続します。

編集:
変数を宣言せずに使用している場合は、暗黙的にグローバルスコープで宣言され、オブジェクトの一部ではありません。一般に宣言する範囲を制限して、すべてがグローバルスコープになるわけではありません。

+1

変数が使用されていない場合は...存在するかどうかは重要ですか? –

+0

変数は、(少なくとも1つのメソッドが存在する限り)どのメソッドでも使用されていなくても、コンストラクタ呼び出しを生き残ります。メソッドは変数を使用する必要はありません。メソッドのスコープにトラップされているため、メソッドは存続します。 –

+0

@Pablo:それほど多くはありませんが、変数を宣言する方法の違いの1つの影響です。 – Guffa