ホームページ  >  記事  >  ウェブフロントエンド  >  JS の字句、静的、動的、関数、およびブロックのスコープを明確にする

JS の字句、静的、動的、関数、およびブロックのスコープを明確にする

黄舟
黄舟オリジナル
2017-02-28 15:00:121646ブラウズ

まあ、たくさん書いたのですが、私の努力のせいで上書きされてしまいました╥﹏╥…

また、このプラットフォームでブログを書いていてマークダウンを使用するのが好きな人には思い出させます。クラスメイト
「オンラインで下書きに保存する」は良い習慣ですね
今日はダブルイレブンなので、何かを買うときが来たような気がします。 。


多くの学生が JavaScript を学習しているときに、「さまざまな」スコープについて聞くことがあります
字句スコープ、静的スコープ、動的スコープ、関数スコープ、ブロック スコープとは何ですか? 明確に
以下であなたの考えを明確にしましょう

スコープ モード

スコープの動作モードは、静的スコープと動的スコープの 2 種類に分けられます

このうち、静的スコープには関数スコープとブロック スコープが含まれます
おそらくクラスメイトが字句スコープについて質問したいと考えています
実際、字句スコープと静的スコープは同じことです

JS の字句、静的、動的、関数、およびブロックのスコープを明確にする

写真は良くありませんが、誰もが私が言いたいことを理解しています

この点が明確になったので、詳しく説明しましょう

もう一つ質問を追加したいのですが、つまり、ダイナミックスコープはありますか? JavaScript?

これに関しては、私が読んだ2冊の本で全く逆の答えが出ました

with文にしてもtry-catch文のcatch句にしても、eval()を含む関数にしても、それらは全て次のように考えてください。ダイナミックスコープ。動的スコープはコード実行中にのみ存在するため、静的分析 (コード構造を調べる) では検出できません。 ——「高性能 JavaScript」 /p24

明確にする必要があるのは、実際には JavaScript には動的スコープがないということです。単純かつ単純な語彙範囲のみです。ただし、このメカニズムはダイナミック スコープに似ています。 ——「あなたの知らない JavaScript (第 1 巻)」/p59

これらの本はどちらも非常に新しく、非常に権威のあるものなので、強くお勧めします

特に「あなたの知らない JavaScript」シリーズは 2 冊目です。先月発売されたのですが、待ちきれずインターネットで購入しました
がっかりしませんでした
ああ、話がそれましたが、本題に戻ります
元の本の著者、マスターたちはたくさんのことを持っていると思います動的スコープに関する意見の相違
だからこそ、この一見矛盾した見方ができるのです
ここで私の立場について話したいと思います
私の理解では、私もそう思います
JavaScript には動的スコープはありません 静的スコープと動的スコープとは何ですか?違い
以下を見てください↓

字句スコープと動的スコープ

コードの一部から始めます

function foo(){
    var a = 1;
    bar();
}function bar(){
    console.log(a);
}var a = 100;
foo();

プリコンパイルとスコープを深く理解してください

JavaScriptの字句スコープでは、最終結果は100を出力します

しかし、スコープが動的スコープの場合、出力される値は 1 になります

これはなぜでしょうか?
字句スコープの最も重要な特徴は、その定義プロセスが記述段階で発生することです (eval() と with が使用されていない場合)
動的スコープにより、実行時にスコープを動的に決定できます

字句スコープは関数がどこにあるかを考慮しますここで宣言されているように、スコープ チェーンはスコープのネストに基づいています

動的スコープは関数が呼び出される場所を考慮し、スコープ チェーンは呼び出しスタックに基づいています

上記の単語をコードに翻訳すると、それは

字句スコープです: なぜならbar 関数はグローバル Declared にあるので、グローバル変数 a の値を出力します
動的スコープ: bar 関数は foo 関数内で呼び出されるため、foo 内の変数 a の値を出力します
これが私の理解です

私は今それに触れています プログラミング言語は限られていますが、そのすべてが動的スコープに基づいている言語は見たことがありません。 . JavaScriptとPHPは関数スコープに基づいており、その他はブロックスコープに基づいています


関数スコープとブロックスコープ

私の理解では、関数スコープは関数コードブロックによって生成されるスコープであり、ブロックスコープはcurlyによって生成されるスコープです。括弧付きコードブロック

よく見かけます これはブログに書いてあることですが、JavaScriptには関数スコープしかありません(大きな間違い)

これは完全に間違いです、異論はありません

JavaScriptは確かに関数スコープに基づいていますが、実際にはそうですブロックスコープがないという意味ではありません
特殊なケースがあります with キーワード、try-catch ステートメントの catch 節、let キーワード (ES6)、const キーワード (ES6) など、かなりの数があります
ここで簡単に触れておきます
withキーワードとcatch句の両方を生成できる Block Scope
これについては記事に詳しく書いたはずです
興味のある方はぜひご覧ください
ポータル –> JavaScriptの欺瞞字句評価、with と catch およびそのパフォーマンスの問題

let キーワードは var と非常に似ており、どちらも変数を宣言しますが、let キーワードは変数をその変数が配置されている任意のスコープにバインドできます
そして let を使用して宣言してもブロック スコープ内では昇格されません
const キーワード変数も宣言しますですが、これは変数をブロック スコープにバインドします。これは、将来 ES6 の知識について書くときに説明します。 「
JavaScriptにはブロックスコープがある
」ということを知っておく必要があります
概要

いつものように、あなたのために要約しましょう

スコープ動作モード:字句/静的スコープ、動的スコープ
  • 字句スコープ:関数スコープ、ブロックスコープ
  • JavaScriptには動的スコープがありません
  • JavaScriptにはブロックスコープがあります
  • with、catch句、let(ES6)、const(ES6)はブロックスコープを生成します
  • 字句スコープは気にする関数が宣言される場所
  • 動的スコープは関数がどこで呼び出されるかを考慮します
  • 字句スコープのスコープチェーンはスコープのネストに基づいています
  • 動的スコープのスコープチェーンはコールスタックに基づいています
  • 上記JS の字句スコープ、静的スコープ、動的スコープ、関数スコープ、およびブロック スコープの内容を明確にすることです。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。