1、JavaScript的全局變量和局部變量
(1) 全局變量
js的全局變量也可以看做window對象的屬性钉稍。
如果在函數(shù)中定義變量時沒有用關(guān)鍵字var涤躲,那么實(shí)際上定義的就是全局變量。
(2)局部變量
要說塊級作用域贡未,那么在js中就只有函數(shù)塊种樱,函數(shù)中定義的變量就是局部變量,當(dāng)然必須有關(guān)鍵字var?÷薄(沒有關(guān)鍵字var定義的都是全局變量)
也就是說if else語句和for循環(huán)中創(chuàng)建的變量在外部都可以訪問的到
<pre>function foo(){ var x = 1;
} for(var i = 0;i<10;i++){
} if(i){ var y = 10;
}
foo();
alert(i);//10
alert(y);//10
alert(x);//error x is not defined</pre>
2缸托、作用域鏈
<pre>var x = 1; function foo(){ var y = 2; function bar(){ var z = 3;
alert(x+y+z);
}
bar();
}
foo();</pre>
在bar函數(shù)中沒有y和z,執(zhí)行x+y+z時瘾蛋,js搜索x俐镐,y,z變量的一種機(jī)制就是作用域鏈哺哼,這個例子的搜索順序:bar->foo->window
bar的作用域鏈?zhǔn)牵?/p>
<pre>**barScopeChain = [
bar.AO,
foo.AO,
global.VO
];**</pre>
foo的作用域鏈?zhǔn)牵?/p>
<pre>fooScopeChain = [
foo.AO,
global.VO
];</pre>
在函數(shù)執(zhí)行過程中佩抹,每遇到一個變量,都會檢索從哪里獲取和存儲數(shù)據(jù)取董,該過程從作用域鏈頭部棍苹,也就是從活動對象開始搜索,查找同名的標(biāo)識符茵汰,如果找到了就使用這個標(biāo)識符對應(yīng)的變量枢里,如果沒有則繼續(xù)搜索作用域鏈中的下一個對象,如果搜索完所有對象都未找到蹂午,則認(rèn)為該標(biāo)識符未定義栏豺,函數(shù)執(zhí)行過程中,每個標(biāo)識符都要經(jīng)歷這樣的搜索過程豆胸。