2017-02-11 1 views
0

私はクロージャについて学んでいます。ガベージコレクタの動作について少し知りたいと思います。次のコードでは:javascriptガベージコレクタのクロージャへの参照として、関数のカウントから返されるオブジェクトはありますか?

function valueMaker(name, value) { 
    var final = {}; 
    final[name] = value; 
    final[double] = value*2; 
    return final; 
} 
first = valueMaker('first', 1); 

私はそれが私がfinalオブジェクトを持っているクロージャを作成valueMaker呼び出すと、そして、それはオブジェクトを返します。

私の質問は:返されたオブジェクトは、クロージャへの参照としてカウントされますか? JavaScriptは私がクロージャを生きたままにしたいときに知っているほどスマートですか?

+2

私はここに閉鎖を見ません。 – NineBerry

+0

@NineBerry:関数を実行すると、関数の実行にクロージャが関連付けられます。http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions-runtime-semantics-評価 – lcjury

+1

いいえ、クロージャは関数の作成ではなく、関数の実行にバインドされています。関数が作成されると、内部関数が作成される外部関数のローカル変数にバインドできます。これはクロージャと呼ばれます。 valueMakerは外部変数にアクセスしないため、valueMaker内に他の関数が作成されていないため、ここではこれは表示されません。 – NineBerry

答えて

2

私はvalueMaker呼び出すと、それは閉鎖

号を作成しvalueMaker内部の機能はありませんので、何の閉鎖はどこにもありません。

閉鎖はfunction valueMaker定義自体が評価されたときに作成し、その閉鎖は、あなたがvalueMaker()を呼び出すとき使用されます。 interesting closureさえありませんが、それは自由変数が使用されないことを前提としています。

+0

"個人的には、彼らは外側の範囲を参照していないので、いいえ。 私は、本当に何が起こっているのか(この場合、コンパイラがしている)の背後に個人的意見を置くように促すことは決して理解できません。 – lcjury

+0

@lcjuryしかし、仕様は何か違うと言います。私はそれがビューに依存していることを強調したいと思っていました。自由変数なしで関数を呼び出すことに反対する引数と反対の引数があります。いずれにしても、これらのケースは面白くありません。正直言って、私は二年前に言ったことを覚えていませんでした、そして、ここで私は反対の点を作っています。 – Bergi

+0

完全に同意しますが、私はコンパイラの観点を知りたがっています。プログラマーの視点ではありません。 私は毎月これに少し疲れています。私は「奇妙な」質問があります。私が他のプログラマーに尋ねるときには、「なぜそれを知りたいのですか?誰でも気にします。これを無視して... "。 – lcjury

関連する問題