2017-02-09 11 views
1

関数foo()を実行するたびに、返される新しいオブジェクトoutが作成されます。そのようなすべてのoutオブジェクトは、2つのプロパティgetNameとsetNameを持ち、どちらも関数です。これらの関数は定義されているスコープを覚えているので、これらの関数は常に変数nameのコピーにアクセスできます。変数はどこに保存されていますか?

私の質問は実際にはnameという変数が各outオブジェクトのメモリに保存されていますか?それは何らかのオブジェクトの中に格納されなければなりません(私が間違っていない場合)。

1)確かに、それはオブジェクトoutに格納されていません。そうでなければ、ドット表記を使用してアクセス可能であったはずです。

2)また、機能オブジェクトfooには格納されません。もしそれがx.setName("JavaScript")だったら、y.getName()の値に影響していたでしょうが、そうではありません。

function foo(){ 
    var name=""; 
    out = { 
     getName: function(){return name;}, 
     setName: function(newName){name = newName} 
    }; 
    return out;}; 

var x = foo(); 

var y = foo(); 
+0

宣言されていない変数はグローバルです。 –

+0

@DenysSéguret 'name'は' foo() 'の最初の行で宣言されています。 – dshapiro

+3

jsのGoogle機能スコープ例:http://ryanmorr.com/understanding-scope-and-context-in-javascript/これは基本的にクロージャが作成されたときに戻ってきます。 – Shilly

答えて

2

JavaScriptには機能スコープがあります。つまり、すべての関数呼び出しには独自の変数セットがあります。関数を使用して変数を宣言すると、この値はこの関数インスタンスに一意に格納されます。このファンクションインスタンスへのアクセスでoutを返す場合、変数はガベージコレクタによってクリアされず、参照が変数を指していない場合とは対照的に、利用可能になります。

JavaScriptのスコープについて詳しくは、here on StackOverflowを参照してください。

1

私の質問は実際に各オブジェクトのメモリに格納されている変数名ですか?

気にする理由がない(おそらく)理由はありません。 JavaScriptエンジンはメモリを管理します。

(私が間違っていない場合)は、何らかのオブジェクトの内部に格納する必要があります。

JavaScriptエンジンは、OO言語で書かれていない場合もあります。

1)確かに、オブジェクトには格納されません。そうでなければ、ドット表記を使用してアクセス可能でした。

いいえ、JavaScriptはスコープをオブジェクトのプロパティとは別に管理します。

2)また、関数オブジェクトfooには格納されません。

再び。番号

変数の値は変数に格納されます。

JavaScriptエンジンは、その変数のメモリ内の記憶域を管理します。

JavaScriptプログラム内からメモリの割り当てを検査することはできません。そのためのAPIは提供されていません。

関連する問題