Javascriptにおけるスコープ及びブロックレベルのスコープ


一、ブロックレベルのスコープの説明
JavaScriptの変数のスコープを学ぶ前に、いくつかの点を明確にしなければなりません。
a、JavaScriptの変数スコープは、その特有のスコープチェーンに基づいている。
b、JavaScriptはブロックレベルの作用領域がない。
c、関数で宣言されている変数は、関数全体で定義されています。
  javascriptの変数のスコープは、通常使用されているクラスC言語とは違って、例えばC莹中のコード:

static void Main(string[] args)
{
   if(true)
   {
    int number=10;
   }
  Console.WriteLine(number);
}
 このコードをコンパイルしても、「現在のコンテキストはnumberが存在しない」ため、通過できません。
  ここで変数のスコープはかっこで定義されているので、ブロックレベルスコープと呼ばれます。
       ブロックレベルのスコープでは、すべての変数が定義された括弧内にあり、定義から括弧終了までの範囲で使用できます。この範囲ではアクセスできないということです。

if(true)
{
  int number=10;
  Console.WriteLine(number);
}
このように、変数の定義は、同じ括弧内で使用されるためにアクセスできます。
しかし、javascriptにはブロックレベルのスコープの概念がありません。
二、javascriptの中の作用領域
 1、関数定義変数のスコープ
       javascriptでは、関数内で定義された変数は、関数内でアクセスできますが、関数外ではアクセスできません。コード:

<script type="text/javascript">
  var num=function()
  {
   var number=10;
  };
  try{
    alert(number);
  }catch(e)
  {
    alert(e);
  } 
</script>
    コードが実行されると、変数numberが定義されていません。関数に定義されている変数は関数外で使用できないため、関数内では任意に使用できます。

<script type="text/javascript">
 var num=function(){
    alert(number);
    var number=10;
    alert(number);
 };
 try{
   num();
 }catch(e){
  alert(e);
 }
</script>
    このコードが実行されたら、エラーを出さずに2回ポップアップします。それぞれundefinedと10です。
 2.サブドメインの親ドメインへのアクセス
     関数は変数のスコープを定義できます。関数の関数はそのスコープのサブドメインです。サブドメインのコードは親ドメインの変数にアクセスできます。コードは以下の通りです。

<script type="text/javascript">
 var func=function(){
    var number=10;
    var sub_func=function(){
      alert(num);
    };
   sub_func();
};
func();
</script>
 このコードの実行結果は10であるが、子ドメインで親ドメインにアクセスするコードも条件付きである。

<script type="text/javascript">
 var func=function(){
    var number=10;
    var sub_func=function(){
      var num=20;
      alert(num);
    };
   sub_func();
};
func();
</script>
このコードは前より一つ多くなりました。「var num=20;」このコードはサブドメインにおいて、サブドメインが親ドメインにアクセスする場合に変化が生じ、このコードの印刷結果は20である。このときサブドメインが訪問するnumは親ドメインの変数ではなく、サブドメインの変数である。このようにアクセスには一定のルールがあり、Javascriptで変数を使って、javascript解釈器はまず現在の作用領域で変数の定義があるかどうかを検索します。もしあるなら、この変数を使って、もしないなら、父の領域に変数を探して、順に類推します。一番上の作用領域まで、まだ見つけられないなら、異常な「変数未定義」を抛り出します。コードは以下の通りです。

<script type="text/javascript">
 (function (){
   var num=10;
   (function (){
     var num=20;
     (function(){
     alert(num);
      })();
   })();
  })();
</script>
このコードが実行された後、20が印刷され、「var num=20」が取り除かれたら、10が印刷されます。同様に「var num=10」が取り除かれます。未定義のエラーが発生します。
JSの作用域とブロックレベルの作用域を紹介します。
作用域は常に任意のプログラム言語の中の重要なものであり、変数とパラメータの視認性とライフサイクルを制御しているからである。ここに言及すると、まず二つの概念を理解します。ブロックレベルのスコープと関数のスコープです。
ブロックレベルのスコープは何ですか?
どのペアの花括弧({と})の語句集も一つのブロックに属しています。この中で定義されているすべての変数はコードブロックの外では見られません。ブロックレベルのスコープと呼びます。
関数のスコープがよく分かります(*^_^*)関数に定義されているパラメータと変数は、関数の外部では見られません。
ほとんどのC言語はブロックレベルの機能領域を持っていますが、JSは持っていません。以下のデモを見てください

//C   
#include <stdio.h> 
void main() 
{ 
  int i=2; 
  i--; 
  if(i) 
  { 
    int j=3; 
  } 
  printf("%d/n",j); 
} 
このコードを実行すると、「use an undefined variable:j」のエラーが発生します。C言語は、ブロックレベルの作用領域を有しており、jはifのブロックで定義されているので、ブロック外ではアクセスできないことがわかる。 
JSはどのように表現していますか?もう一つのデモを見ます。

functin test(){ 
 for(var i=0;i<3;i++){   
 } 
 alert(i); 
} 
test(); 
 このコードを実行して、「3」をポップアップします。ブロックの外で、ブロックに定義されている変数iはまだアクセス可能です。つまり、JSはブロックレベルのスコープをサポートしていません。関数のスコープだけをサポートしています。また、関数内の任意の位置で定義された変数はこの関数のどこにでも見られます。 
じゃ、私達はどのようにJSにブロックレベルの作用領域を持たせるべきですか?覚えていますか?一つの関数で定義された変数は、この関数が呼び出された後、変数が破壊されます。JSのブロックレベルのスコープをこの特性でシミュレートできますか?このDEMOを見てください。

  function test(){ 
 (function (){ 
 for(var i=0;i<4;i++){ 
 } 
 })(); 
 alert(i); 
} 
test(); 
この時に再度運行して、“i”の定義していない誤りを弾いて、ハッハッ、実現したでしょう~~ここ、私達はfor文のブロックをひとつのクローズドの中に置いて、それからこの関数を呼び出して、関数の呼び出しが終わったら、変数iは自動的に廃棄して、だから私達はブロックの外で訪問することができませんでした。 
JSのクローズド特性is the most import feature(*^_^*)分かります。JSでは,ネーミング競合を防ぐために,大域変数と大域関数の使用を極力避けるべきである。では、どうやって避けるべきですか?はい、上記のdemoに示すように、定義するすべての内容を一つに入れることができます。

(function (){ 
//   
})(); 
締め括りをつける
以上述べたのは小编が皆さんに绍介したJavascriptの中の作用域とブロック级の作用域です。皆さんに助けてほしいです。ここでも私たちのサイトを応援してくれてありがとうございます。