JavaScript スコープは、グローバル スコープとローカル スコープの 2 つのカテゴリに分類されます。変数は関数の外部でグローバル変数として定義され、グローバル変数にはグローバル スコープがあります。つまり、Web ページ内のすべてのスクリプトと関数を使用できます。変数は関数内でローカル スコープとして宣言され、ローカル スコープは通常、関数内でのみ使用されます。固定コードフラグメント (関数など) には内部的にアクセスできます。
このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。
変数のスコープとは、スクリプト コード内の変数の有効な読み取りおよび書き込み可能な範囲、つまり、変数を使用できるスクリプト コード内の領域を指します。
変数のスコープは、主にグローバル スコープとローカル スコープ (関数スコープとも呼ばれます) の 2 種類に分かれます。
対応するスコープ内の変数をそれぞれグローバル変数、ローカル変数と呼びます。グローバル変数はすべての関数の外部で宣言され、ローカル変数は関数本体または関数の名前付きパラメーター内で宣言された変数です。
グローバル スコープ
変数は関数の外部でグローバル変数として定義されます。グローバル変数にはグローバル スコープがあり、Web ページ内のすべてのスクリプトと関数が使用できます。
コード内のどこからでもアクセスできるオブジェクトはグローバル スコープを持ちます。一般に、次の状況がグローバル スコープを持ちます:
1. 最外部関数と最外部関数 レイヤー関数の外側で定義された変数グローバル スコープを持つ
# 2. 定義されておらず、値が直接割り当てられていないすべての変数は、自動的にグローバル スコープを持つように宣言されます# 3. ウィンドウ オブジェクトのすべてのプロパティはグローバル スコープを持つ
通常、ウィンドウ オブジェクトの組み込みプロパティには、window.name、window.location、window.top などのグローバル スコープがあります。
ローカル スコープ変数は関数内でローカル スコープとして宣言されます。
グローバル スコープとは対照的に、ローカル スコープは通常、固定コード フラグメント (例: 関数) 内でのみアクセスできます。最も一般的なものは関数内にあるため、場所によっては、 this この種のスコープは関数スコープと呼ばれます。
つまり、JS パーサーが実行されると、最初に実行環境でグローバル オブジェクトが構築されます。定義したグローバル プロパティは、オブジェクトのプロパティとして読み取られます。トップレベルのコードでは、次を使用します。 this キーワードとウィンドウ オブジェクトの両方からアクセスできます。
関数本体内のローカル変数は、関数実行時に生成される呼び出し元オブジェクト内にのみ存在し、関数実行と同時に破棄されます。
したがって、プログラミングでは、変数を合理的に宣言する方法を考慮する必要があります。これにより、不必要なメモリのオーバーヘッドが削減されるだけでなく、変数の繰り返し定義や以前に定義された変数の上書きによるデバッグが大幅に回避されます。
説明:変数のスコープは、宣言メソッドと密接に関連しています。 var を使用して宣言された変数にはグローバル スコープと関数スコープがあり、let と const を使用して宣言された変数にはグローバル スコープとローカル スコープがあります。
var は変数のプロモーションをサポートしているため、var 変数のグローバル スコープはページ全体のスクリプト コードに対して有効ですが、let と const は変数のプロモーションをサポートしていないため、let のグローバル スコープはconst変数が参照するのはページ全体の宣言文の先頭からスクリプトコードの最後までの全領域であり、宣言文より前の領域は無効となります。
同様に、var は変数のプロモーションをサポートしていますが、let と const は変数のプロモーションをサポートしていないため、var を使用して宣言されたローカル変数は関数全体で有効ですが、let と const を使用して宣言されたローカル変数は関数の先頭から有効です。宣言文から関数の末尾までが有効となります。ローカル変数とグローバル変数が同じ名前である場合、関数スコープ内ではローカル変数がグローバル変数を上書きする、つまり、ローカル変数は関数本体内で機能しますが、関数本体外では機能することに注意してください。グローバル変数は機能し、ローカル変数も機能します。変数は無効であり、ローカル変数を参照すると構文エラーが発生します。
例: 変数のスコープ var v1 = "JavaScript"; //全局变量
let v2 = "JScript"; //全局变量
let v3 = "Script"; //全局变量
scopeTest(); //调用函数
function scopeTest(){
var lv = "aaa"; //局部变量
var v1 = "bbb"; //局部变量
let v2 = "ccc"; //局部变量
console.log("函数体内输出的lv = " + lv); //aaa
console.log("函数体内输出的v1 = " + v1); //bbb
console.log("函数体内输出的v2 = " + v2); //ccc
console.log("函数体内输出的v3 = " + v3); //Script
//v4为全局变量,赋值在后面,因而值为undefined
console.log("函数体内输出的v4 = " + v4);
}
var v4 = "VBScript"; //全局变量
console.log("函数体外输出的lv = " + lv); //① 报ReferenceError错误
console.log("函数体外输出的v1 = " + v1); //JavaScript
console.log("函数体外输出的v2 = " + v2); //JScript
console.log("函数体外输出的v3 = " + v3); //Script
console.log("函数体外输出的v3 = " + v4); //VBScript
ローカル変数 v1 および v2 がグローバル変数 v1 および v2 と同じ名前を持っていることがわかります。scopeTest 関数本体では、ローカル変数 v1 および v2 が有効であるため、関数内のこれら 2 つの変数の出力結果は次のようになります。本体は "bbb" " と "ccc" です。関数本体の外側では、グローバル変数 v1 と v2 が有効であるため、関数本体の外側では、これら 2 つの変数の出力結果はそれぞれ "JavaScript" と "JScript" になります。
また、グローバル変数 v3 と v4 は関数本体内で上書きされず、グローバル変数の値が出力されるため、v3 の関数本体内および関数外の出力結果は「スクリプト」となります。 v4 変数の割り当ては関数内にあります。呼び出し後、関数本体内の v4 の出力結果は「未定義」ですが、関数本体外の出力は宣言後であるため、結果は「VBScript」になります。 lv はローカル変数であるため、関数の外でアクセスすると「ReferenceError」エラーが報告されます。
上記のコードを Chrome ブラウザで実行した後、ブラウザのコンソールを開くと、以下に示すような出力が表示されます。
上の図コード 18 行目 (例①でコメントしたコード) の参照定義エラーが報告されますが、これは lv 変数がローカル変数であり、関数から抜けた後は無効になるためです。このコード行をコメントにして実行します。この時点で、ブラウザ コンソールを開くと、次の図に示す結果が表示されます
[推奨学習:JavaScript 上級チュートリアル]
以上がJavaScript スコープの 2 つのカテゴリとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。