JSのスコープ問題

2158 ワード

一、ブロックレベルのスコープ
JavaScriptでは、スコープはアクセス可能変数、オブジェクト、関数のセットです.
jsにはブロックレベルのスコープがありません.関数レベルのスコープしかありません.関数の外の変数関数の中には見つけられます.関数の中の変数は外に見つけられません.
var a=10; 
function aaa(){ 
 alert(a);
};            
function bbb(){
var a=20;
aaa();
}
bbb(); //   10,  aaa()       bbb()       ,       a=10,      。
二、グローバル変数
変数は関数外で定義されています.すなわちグローバル変数です.
グローバル変数 グローバルスコープ:ホームページ内のすべてのスクリプトと関数が使用できます. 
関数が定義されると、関数オブジェクトの内部にコード論理だけでなく、内部属性[Scope]も定義されています.この関数が大域環境で定義されると,この作用分域鎖には大域作用分域しかない.
var a=10;
function aaa(){ 
    alert(a);
};
aaa(); //a           ,             10
varで変数を定義しないとグローバル変数としてデフォルトになります. 
function aaa(){
   a=10; 
}
aaa();
alert(a); //   10; 
//   :
var a;
function aaa(){
  a=10;
};
aaa();
alert(a);
宣言されていない変数に値を割り当てると、この変数はグローバル変数になります.例えば、var a=b=10;b=10に解析できます.var a=b;つまり、bはグローバル変数であり、aは局所変数であるため、外部からaにアクセスできず、bにアクセスした結果は10である.したがって、このような隠れた危険を回避するために、変数を定義するときは、すべての変数にvarを加えます.
function aaa(){
      var a=b=10; 
}
 aaa();
 alert(a);//   ,     
 alert(b);//   10;
変数の検索は近くの原則で、var定義の変数を探しに行きます.近くに見つけられなかったら、外層を探しに行きます.第二の点では、変数の宣言は、スコープの上部に前倒しされ、その場所に割り当てられた値が残されています.以下の例です. 
function aaa(){
  alert(a);
  var a=20;
}
aaa(); //   :undefined  
/**************/
var a=10;
function aaa(){
  alert(a);
  var a=20;
}
aaa(); //   :undefined
      :
var a=10;
function aaa(){
  var a; //     
  alert(a);
  a=20; //       
}
aaa();
三、ローカル変数
変数は関数内で宣言され、変数は局所的なスコープです.
ローカル変数:関数の内部のみにアクセスできます.
局所変数は関数内にしか作用しないので、異なる関数は同じ名前の変数を使うことができます.
局部変数は関数の実行開始時に作成され、関数の実行が終わると局部変数が自動的に破壊されます.
function aaa(){
var a=10;  
};
aaa();
alert(a); //a    aaa()          ,       
パラメータとローカル変数の名前が重なった場合、優先度は同じです.
 var a=10;
    function aaa(a){ 
        alert(a);
        var a=20;  //   a    ,      var a;        a         。
    } 
    aaa(a); //   :10
変数が変更されると他の変数が変わりますが、変数が再定義されると別の変数は変わりません.
var a=[1,2,3];
var b=a;
b.push(4); 
alert(a);//   [1,2,3,4]  b     a        

 b         a    .  :
var a=[1,2,3];
var b=a;
b=[1,2,3,4]
alert(a)//   [1,2,3]