JavaScript の基礎: スコープ

JavaScript の基礎: スコープ

AO と BO について話す前に、スコープの概念を理解する必要があります。これにより、this が何を指すのかなど、後で多くのことを理解しやすくなります。

範囲

スコープとは、変数、関数、およびオブジェクトが定義された後に使用できる範囲のことです。

コンソールログ(a)
{
    var a = 1;
}
関数テスト(){
     var b = 2;
}

ここに画像の説明を挿入

変数bは外部では使用できないことがわかります。スコープにより、外部からのデータの恣意的なアクセスや変更を防止できることがわかります。スコープによって互いの変数を分離できることは容易にわかります。つまり、異なるスコープ内の同じ名前の変数は競合しません。

最も重要かつよく使用されるスコープは、グローバル スコープと関数スコープです。しかし、ES6 以降では、let および const キーワードの登場により、ブロックレベルのスコープが導入されました。

グローバルスコープ

簡単に言えば、グローバル スコープとは、すべてのドメインがスコープ内の変数とメソッド オブジェクトにアクセスできることを意味します。

var a = "global1";
 関数テスト(){
    b="var がない場合、暗黙的にグローバル変数に変換されます";
    window.c="変数 c を window として直接設定すると、グローバルにもなります";
    var d="非グローバルスコープ";
 }
 #最初のステップはtest()を実行することです
test() #メソッド内の変数を定義して値を割り当てます #ステップ2 console.log(a)
コンソールログ(b)
コンソール.log(c)
コンソールログ(d)

ここに画像の説明を挿入

一般的に言えば、window のプロパティはグローバル変数であり、window.c 形式では実際に c が wi​​ndow のプロパティとして扱われます。変数を宣言するときは、var を使用しないことに注意してください。グローバル変数に昇格してデータが汚染されないように、var を使用することをお勧めします。

また、テストメソッドもグローバルメソッドです。

関数テスト(){
    var a = 関数(){
        console.log("リテラルメソッド")
    }
    b = 関数(){
        console.log("var リテラルのないメソッド")
    } 
   関数test1(){
       console.log("通常の宣言方法")
   }
     
}
 

ここに画像の説明を挿入

これは、リテラル宣言方法が、関数を変数に割り当ててそれを変数として扱うことに似ていることを示しています。これはプリコンパイル中にも実証されました。

関数のスコープ

関数スコープはグローバル スコープの反対です。どこでも使用されるわけではなく、特定の範囲内でのみ使用されます。通常、宣言された変数は関数内でのみ使用されます。

関数テスト(){
     var a="非グローバルスコープ";
     コンソールログ(a)
}

ここで別の問題が発生します。関数スコープ内の変数はグローバル メソッドで使用できます。では、関数は、その下の関数によって生成される関数スコープを持つことができるのでしょうか?また、それらの変数は互換的に使用できるでしょうか?

関数テスト(){
     var a="テストメソッドのスコープ";
    関数test1(){
         var b="test1 メソッドのスコープ";
        console.log("aの値=",a);
    }
    # 関数 test1() 内で関数を呼び出します。
     console.log("bの値=",b);
 }

ここに画像の説明を挿入

ここで、スコープが階層化されていることがわかります。内側のスコープは外側のスコープの変数にアクセスできますが、外側のスコープは内側の変数にアクセスできません。

もし、スイッチ、のために、その間

条件文と論理ループは関数ではなく、関数のように動作せず、新しいスコープも作成しません。 **ブロックが定義されている変数は、存在するスコープ内に残ります。

関数テスト(a){
    もし(a>1){
        var b = 13;
    }それ以外{
       var b = 1;  
    }
    コンソールログ(b);
}

ここに画像の説明を挿入

したがって、条件文や論理ループを使用する場合は、グローバル スコープで使用しないようにしてください。メソッド本体内の変数が他のデータに影響を与えるためです。

ブロックスコープ

ブロック スコープの出現には通常、let または const の 2 つのキーワードのいずれかが必要です。そうでない場合、ブロック スコープは存在しません。

ここに画像の説明を挿入

関数テスト(a){
    定数b="23";
    (a>2)の場合{
        定数 c=3
        console.log("一人称 if---c-----",c)
    }
    (a>1)の場合{
        console.log("二人称 if----b----",b)
        console.log("二人称if----c----",c)
    }
     
}

ここに画像の説明を挿入

キーワード let と const がある場合、変数のスコープはその変数が宣言されている中括弧のペア内にあることがわかります。したがって、最初の if の c 変数は 2 番目の if では取得できません。もちろん、内部スコープは外部スコープの変数にアクセスできることになります。

letとconstの詳細については、前の記事をご覧ください。アドレス

スコープチェーン

この一見魔法のような概念は、簡単に言えば、スコープ内に存在する場合は直接使用され、次のレベルに存在しない場合は、グローバル スコープが見つかったときに終了される、というものです。

変数a=1
var b = 3
関数テスト(){
    変数a=2
    console.log("aの値",a);
    console.log("bの値",b);
}
 

ここに画像の説明を挿入

ちなみに、スコープチェーンの検索ロジックは、実はプロトタイプチェーンの検索ロジックと同じです。これについては後ほど引き続きお話しします。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScript ES 新機能ブロックスコープ
  • JavaScript 上級プログラミング: 変数とスコープ
  • JavaScript スコープチェーンの基本原理のグラフィカルな説明
  • JavaScript の静的スコープと動的スコープを例を使って説明します
  • Javascript のスコープとクロージャの詳細
  • JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明
  • JavaScriptスコープについての簡単な説明

<<:  CSS3 アニメーション ボールローリング JS コントロールアニメーション一時停止

>>:  Web ページ WB.ExecWB 制御印刷メソッド呼び出しの説明とパラメータの紹介

推薦する

jQueryはフォーム検証機能を実装します

jQuery フォーム検証の例 / ユーザー名、パスワード、住所、電子メールの検証を含む下記の通り ...

jsは徐々に増加するデジタルアニメーションを実現します

目次背景コンテナを固定し、数字を上にスクロールすることで、スクロールホイールと同様の効果を実現します...

Minio 軽量オブジェクト ストレージ サービスのインストールとブラウザの使用チュートリアル

目次導入インストール1. マウントするフォルダを作成する2. イメージをプルする3. コンテナを作成...

MySQL の主キーとトランザクションの詳細な説明

目次1. MySQLの主キーとテーブルフィールドに関するコメント1. 主キーと自動増分2. テーブル...

Linux コマンドを素早く習得する 4 つの方法

Linux マスターになりたいなら、いくつかの Linux コマンドを習得することが不可欠です。 L...

JavaScript コンストラクタとプロトタイプの関係

目次1. コンストラクタとプロトタイプ1. コンストラクター2. コンストラクタ問題3. コンストラ...

Vue ElementUI フォームのフォーム検証

フォーム検証は、フロントエンド開発プロセスで最もよく使用される機能の 1 つです。私の個人的な仕事経...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

VantフレームワークをWeChatアプレットに導入するプロセス全体の記録

序文WeChat ミニプログラムのネイティブ UI が少し物足りないと感じることがあるので、サードパ...

MySQLでの少し複雑な使用例コード

序文MySQL の構文は誰にとっても難しいものではないと思いますが、この記事では主に MySQL の...

MySQL の on と where における左結合設定条件の使用法の違いの分析

この記事では、MySQL の左結合における on 条件と where 条件の使用法の違いを例を使って...

表面的なウェブデザイン

<br />私はいつもYahooのウェブデザインが素晴らしいと信じてきました。しかし、こ...

jsはフォーム検証機能を実装します

この記事の例では、フォーム検証機能を実装するためのjsの具体的なコードを参考までに共有しています。具...

Centos7.3 に mysql5.7.18 をインストールするための詳細なチュートリアル

1 Linuxディストリビューションのバージョンを確認する[root@typecodes ~]# c...

ReactHooks バッチ更新状態とルートパラメータの取得例の分析

目次1. 一括更新の方法コンソール出力2. フックがルーティングパラメータを取得する方法実行効果1....