関数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();
宣言されていない変数はグローバルです。 –
@DenysSéguret 'name'は' foo() 'の最初の行で宣言されています。 – dshapiro
jsのGoogle機能スコープ例:http://ryanmorr.com/understanding-scope-and-context-in-javascript/これは基本的にクロージャが作成されたときに戻ってきます。 – Shilly