1

静的スコープでは、ソースコードを分析/解析することで識別子を決定できます (多かれ少なかれ、呼び出し元の環境を知る必要がある動的スコープに対して)。

私の質問はこれです.静的スコープはソースコードを解析してスコープと識別子のバインディングを知る必要があるだけなので、コンパイル時に行われるスコープ環境/識別子のバインディングですか、またはこれらのバインディングは各関数(または新しいスコープ)がアクセスされるときに決定されます. .

JavaScript の例:

var globalVar;
function fooFunc() {
  var fooVar;
  function barFunc() {
    var barVar;
  }
}

この単純な JavaScript の例では、プログラムを調べることで、barFunc 環境に barVar の変数があり、fooVar と barFunc 関数を持つ親環境があり、グローバルの親環境があることを視覚的に判断できます。 globalVar を持つスコープ。コンパイラ/インタプリタがソース コード全体を読み取ってバインディングを作成するのか、それともこれらの決定が関数ごと (またはスコープごと) で行われるのか、興味があります。

不明な点がある場合は、お知らせください。

ありがとうございました、

編集:私の例はJavaScript(特に興味があります)にありますが、これが言語(JavaScript、C / C ++、C#/ VBなど)間で異なるかどうかも興味があります.

4

2 に答える 2

0

JavaScript では、関数が呼び出されたときにのみスコープが作成されます。したがって、例にはグローバルスコープで宣言された関数内に関数がありますが、グローバルスコープのみが存在します。

fooFuncスコープとスコープは、andが呼び出されるbarFuncまで存在しません。それらは決して呼び出されないため、グローバルスコープはプログラム内の唯一のスコープです。ああ、呼び出されなかったので存在さえしません。fooFuncbarFuncbarFuncfooFunc

JavaScript で関数を呼び出すと、新しい実行コンテキストが作成されます。実行コンテキストは、関数のスコープと考えることができます。詳細については、この回答を参照してください: https://stackoverflow.com/a/9384894/783743

ところで、JavaScript でも動的スコープをシミュレートできます: eval に頼らずに JavaScript で動的スコープを実現することは可能ですか?

于 2013-02-22T16:13:53.067 に答える
0

Javascript 用のコンパイラはないと思いますし、議論を引き起こしたくありません。

あなたの質問に来て、Javascriptがブラウザにダウンロードされたときに関数の本体が実行されることはありません。明示的に呼び出す必要があります。したがって、関数が呼び出されない限り、変数バインディングを作成する方法はありません。

于 2013-02-22T16:14:02.700 に答える