1. ホーム
  2. javascript

[解決済み] 語彙的スコープとは何ですか?

2022-03-23 03:09:11

質問

レキシカルスコーピングの簡単な紹介は?

どのように解決するのですか?

例題で理解しました :)

最初に 字句の範囲 (とも呼ばれます)。 静的スコープ ) を、C言語ライクな構文で表現しています。

void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

すべての内側のレベルは、その外側のレベルにアクセスすることができます。

という方法もあります。 ダイナミックスコープ の最初の実装で使用された Lisp また、C言語ライクな構文で。

void fun()
{
    printf("%d", x);
}

void dummy1()
{
    int x = 5;

    fun();
}

void dummy2()
{
    int x = 10;

    fun();
}

ここで fun にアクセスすることができます。 xdummy1 または dummy2 または、任意の x を呼び出すすべての関数で funx と宣言しています。

dummy1();

は5と表示されます。

dummy2();

は10と表示されます。

前者はコンパイル時に推論できるため静的と呼ばれ、後者は外側のスコープが動的で関数の連鎖呼び出しに依存するため動的と呼ばれる。

静的なスコーピングは目に優しいと思うんです。Lispでさえも、ほとんどの言語が最終的にこの方式になりました(両方できますよね)。動的スコープとは、呼び出された関数にすべての変数の参照を渡すようなものです。

なぜコンパイラが関数の動的スコープの外側を推測できないかの例として、前回の例を考えてみましょう。もし、こんな風に書いたら

if(/* some condition */)
    dummy1();
else
    dummy2();

コールチェーンは実行時の条件に依存する。もしそれが真であれば、コールチェーンは次のようになる。

dummy1 --> fun()

条件がfalseの場合。

dummy2 --> fun()

の外部スコープは fun どちらの場合も呼び出し元である に加えて、呼び出し側の呼び出し側など .

なお、C言語では関数のネストやダイナミックスコーピングはできません。