javascript(関数のスコープと声明の前倒し)
1402 ワード
いくつかのc言語のようなプログラミング言語では、かっこ内のコードはそれぞれの役割領域を持っています.しかも変数は彼らのコードセグメント以外では見られないと宣言しています.ブロックレベルのスコープと呼ばれます.javascriptにはブロックレベルの機能領域がありません.代わりにjavascriptは関数のスコープを使用しています.変数はその関数体とこの関数のネストを宣言する任意の関数の中に定義されています.以下のコードにおいて、i,j,kは異なる位置で定義されています.彼らはもう一つの作用領域で定義されています.
function text(o)
{
var i=0;
alert(typeof o);
if(typeof o == "string")
{
var j=0;
for(var k=0;k<10;k++)
{
alert(k);// 0-9
}
alert(k);// 10
}
alert(j);// 0
}
javascriptの関数的スコープとは、関数の内部で宣言されたすべての変数が関数の中で常に見られます.興味深いことに、これは変数が声明の前ですでに利用可能であることを意味します.javascriptのこの特性は非公式に声明の早期(hoisting)と呼ばれています.すなわちjavascriptの関数は体内で宣言されているすべての変数(賦値に関係しない)が関数の上部に「繰り上げ」されます.以下のコードを見てくださいvar global="globas";
function globals()
{
alert(global);//undefined
var global="hello QDao";
alert(global);//hello QDao
}
関数の作用領域の特性のために、局所変数は関数全体において常に定義されており、すなわち、関数体内部変数において同名の大域変数がカバーされている.それでも、プログラムがvar文に実行される時、局所変数は本当の値を与えられます.したがって、上述のプロセスは、関数内の変数宣言を関数の上部に「前倒し」し、同僚変数を元の位置に初期化することと等価です.var global="globas";
function globals()
{
var global;
alert(global);//undefined
global="hello QDao";
alert(global);//hello QDao
}