スコープは、変数とパラメーターの可視性とライフサイクルを制御するため、どのプログラミング言語でも常に最も重要なものです。そういえば、まずブロックレベルスコープと関数スコープという 2 つの概念を理解してください。
ブロックレベルのスコープとは何ですか?
中括弧 ({ と }) のペア内のステートメントのセットはブロックに属し、ブロック内で定義されているすべての変数はコード ブロックの外では見えません。これをブロック レベル スコープと呼びます。
関数のスコープがわかりやすい(*^__^*) 関数内で定義されたパラメータや変数は関数の外からは見えません。
ほとんどの C 系言語にはブロックレベルのスコープがありますが、JS にはありません。以下のデモをご覧ください:
//C语言 #include <stdio.h> void main() { int i=2; i--; if(i) { int j=3; } printf("%d/n",j); }
このコードを実行すると、「未定義の変数を使用してください:j」というエラーが表示されます。ご覧のとおり、j は if ステートメント ブロック内で定義されているため、C 言語のスコープはブロック レベルであり、ブロックの外ではアクセスできません。
JS はどのように動作するのでしょうか?
別のデモを見てみましょう。functin test(){ for(var i=0;i<3;i++){ } alert(i); } test();
このコードを実行すると、「3」がポップアップします。ブロックの外では、ブロック内で定義した変数にまだアクセスできることがわかります。つまり、JS はブロックレベルのスコープをサポートせず、関数スコープのみをサポートし、関数内の任意の場所で定義された変数は関数内の任意の場所で参照できます。
では、JS にブロックレベルのスコープを持たせるにはどうすればよいでしょうか?関数内で定義された変数は、関数が呼び出されるときに破棄されることをまだ覚えていますか? この機能を使用して JS のブロックレベルのスコープをシミュレートできますか?以下のデモをご覧ください:
function test(){ (function (){ for(var i=0;i<4;i++){ } })(); alert(i); } test();
この時点でもう一度実行すると、「i」未定義エラーが表示されます。ははは、実装されました~~~ここでは、for ステートメント ブロックをクロージャに入れて、この関数を呼び出します。関数呼び出しが完了すると、変数 i は自動的に破棄されるため、ブロックの外から変数 i にアクセスすることはできません。
JS のクロージャ機能は最も重要な機能です ((*^__^*) 誰もが知っています)。 JS では、名前の競合を防ぐために、グローバル変数やグローバル関数の使用を避ける必要があります。では、それを避けるにはどうすればよいでしょうか?はい、上のデモに示すように、定義したいものはすべて
に入れることができます。(function (){ //内容 })();
さん、現時点では、その外層に関数スコープを追加するのと同じでしょうか?この範囲外のプログラムはアクセスできません。