JavaScript--ブロックレベルスコープ

5525 ワード

参考文章1参考文章2
ブロックレベルのスコープは何ですか?
どのペアの花括弧({と})の語句集も一つのブロックに属しています.この中で定義されている変数は全部コードブロックの外で見られません.ブロックレベルのスコープと呼びます.例えばfor、while、if.
JavaScriptはブロックレベルのスコープを持っていません.すなわち、javascriptのコードブロックに変数を定義します.このコードブロックの外でもこの変数を使用できます.例えば、
<script type="text/javascript">  
   var i=1;  
     if(i==1){  
        var b=2;  
     }  
   alert(b);//  2  

   function outputNumbers(count){
       for(vari=0;i<count;i++){
           alert(i);
       }
           alert(i); //  
    } 
</script>  
Java、C++などの言語では、変数iはforループのステートメントブロックに定義があり、ループが終了すると変数iは破棄されます.しかし、JavaScriptでは、変数iはoutput Numbers()の活動対象として定義されていますので、定義がありますから、関数の内部に随所にアクセスすることができます.
なぜJavaScriptでブロックレベルのスコープを実現しますか?
ブロックレベルのスコープは多すぎる大域変数と関数による命名衝突を解決できます.JavaScriptは重複した声明を無視しています.(ただし、その後の声明の変数初期化を実行します.)ため、結果が間違っています.あなたは大きな力を使ってこのエラーを発見することができます.
多くの開発者によって作成された大規模なアプリケーションでは、プライベートスコープのアプリケーションは、全体的なスコープの混乱を心配することなく、開発者ごとに独自の変数を使用することができます.
JavaScriptはどうやってブロックレベルのスコープを実現しますか?
jsにはブロックレベルのスコープがないが、ブロックレベルのスコープをクローズド/匿名関数で模倣することができる.
ブロックレベルのスコープ(一般にプライベートスコープと呼ばれる)の匿名関数のシンタックスは以下の通りである.
(function(){

  //        

})();
上記のコードを定義し、直ちに匿名関数を呼び出しました.関数宣言をペアの括弧に含めます.これは実際に関数式です.続いているもう1つのペアの括弧は、すぐにこの関数を呼び出します.
JavaScriptにおいて、ブロックレベルのスコープを匿名関数で実現する例
function outputNumbers(count){
   (function(){
      for(var i=0;i<count;i++){
          alert(i);
         }
        })();
    alert(i); //    !
   }
例では、匿名関数で定義された任意の変数は、実行終了時に破棄されます.したがって、変数iはサイクルでのみ使用でき、使用後は廃棄される.プライベートスコーンにアクセスできるのは、この匿名関数がクローズドされており、作用領域を含むすべての変数にアクセスできるからです.
いつプライベートエリアが使えますか?
どこにいても、一時的に変数が必要であれば、プライベートスコープを使用することができます.
理解を深める:javascript作用域のブロックレベルの作用域