JSのスコープ問題
2158 ワード
一、ブロックレベルのスコープ
JavaScriptでは、スコープはアクセス可能変数、オブジェクト、関数のセットです.
jsにはブロックレベルのスコープがありません.関数レベルのスコープしかありません.関数の外の変数関数の中には見つけられます.関数の中の変数は外に見つけられません.
変数は関数外で定義されています.すなわちグローバル変数です.
グローバル変数 グローバルスコープ:ホームページ内のすべてのスクリプトと関数が使用できます.
関数が定義されると、関数オブジェクトの内部にコード論理だけでなく、内部属性[Scope]も定義されています.この関数が大域環境で定義されると,この作用分域鎖には大域作用分域しかない.
変数は関数内で宣言され、変数は局所的なスコープです.
ローカル変数:関数の内部のみにアクセスできます.
局所変数は関数内にしか作用しないので、異なる関数は同じ名前の変数を使うことができます.
局部変数は関数の実行開始時に作成され、関数の実行が終わると局部変数が自動的に破壊されます.
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]