2017-05-10 8 views
0

参考:あなたはJS(&クロージャをスコープ)JavaScript内部:コンパイルと実行の中間に格納される変数はどこにありますか?

第2章知らない:レキシカルスコープ

を例に考えてみましょう:

var a = 2; 

JavaScriptが最初に上記のコードをコンパイルします。最初にコンパイラは字句解析を行います。

var a; & 
a = ?; 

これを分解してvar aとして範囲を通知します。スコープは、そのスコープ内に存在するかどうかの情報を保持します。

その後、実行ステージが開始されます。ここで、a = 2が割り当てられる。私は、実行ステージ前に格納されている "a"、つまりa = "2"の値がどこで開始されているか、つまりメモリ割り当てが起こっているかを理解しようとしています。

+1

「a」を格納する場所が必要なので、確実にメモリ割り当てが行われています。その処理方法は、問題のJSエンジンに基づいて異なります。 –

+0

@MikeCそれでは、コンパイラ自身がデータをメモリに格納するかどうかという疑問が生じます。 もう1つ、この情報はどこで入手できますか? JavaScriptの内部のように... –

+0

*インタプリタ*は値をメモリに保持します。必要に応じてディスク上のどこかに値を保持します。 *コンパイラ*は出力を提供するだけです。エンジンの内部を理解したい場合は、V8ソースコードを探してみることをお勧めします。 –

答えて

1

コンパイラはレキシカルブレークダウンだけでなく、全体のコードを2などのリテラルも保持する適切なデータ構造(たとえば、parse tree)に解析します。基本的に「変数aのスコープ内で、定数式2から派生した値を、aという名前の変数に代入します。

+0

これは面白いです!したがって、コンパイラー自体は解析ツリーとして情報を保持します。これは、コンパイラがデータをメモリに保存することを意味します。つまり、コンパイル後にそのデータがクリアされます。 ちょっと好奇心旺盛! –

+0

いいえ、データを消去しません。そのデータは、インタプリタがコードを実行するために必要なコンパイラの出力です。 – Bergi

関連する問題