作用域
作用域是JavaScript中一個(gè)較難處理的特性。所有面向?qū)ο蟮木幊陶Z(yǔ)言都有某種形式的作用域;這要看是什么上下文約束著作用域。在JavaScript里,作用域由函數(shù)約束,而不由塊約束(如while,if,和for里的語(yǔ)句體)。最終可能使得一些代碼的運(yùn)行結(jié)果表面上顯得怪異(如果你來(lái)自一種塊作用域語(yǔ)言的話)。程序2-10的例子說(shuō)明了“函數(shù)作用域代碼”的含義。
代碼2-10. JavaScript中變量作用域是怎樣工作的例子
//設(shè)置一個(gè)等于"test"的全局變量foo var foo = "test";
//在if塊中 if ( true ) { //設(shè)置foo為"new test" //注意:這仍然是在全局作用域中 var foo = "new test"; }
//正如我們?cè)诖颂幙梢?jiàn),foo現(xiàn)在等于"new test" alert( foo == "new test" );
//創(chuàng)建一個(gè)修改變量foo的函數(shù) function test() { var foo = "old test"; }
//調(diào)用時(shí),foo卻駐留在是在函數(shù)的作用域里面 test();
//確認(rèn)一下,foo的值仍然是"new test" alert( foo == "new test" );
在程序2-10中你會(huì)發(fā)現(xiàn),變量位于在全局作用域;跒g覽器的JavaScript有趣的一面是,所有的全局變量實(shí)際上都是window對(duì)象的屬性。盡管一些老版本的Opera瀏覽器或Safari瀏覽器不是這樣,假定瀏覽器這樣工作通常是一個(gè)很好的經(jīng)驗(yàn)規(guī)則。程序2-11展示了一個(gè)這種例子。 程序2-11. JavaScript的全局變量與window對(duì)象的例子
//全局變量,包含字符串"test" var test = "test";
//你會(huì)發(fā)現(xiàn),我們的全局變量和window的test屬性是相同的 alert( window.test == test );
最后,讓我們來(lái)看看當(dāng)一個(gè)變量漏定義時(shí)會(huì)怎樣。程序2-12里,變量foo在test()的作用域里被賦值。但是,程序2-12里實(shí)際并沒(méi)有(用var foo)定義變量的作用域。當(dāng)變量foo沒(méi)有明確定義時(shí),它將成為全局變量,即使它只在函數(shù)的上下文使用。
程序2-12. 隱式全局變量聲明的示例
//一個(gè)為變量foo賦值的函數(shù) function test() { foo = "test"; }
//調(diào)用函數(shù)為foo賦值 test();
//我們發(fā)現(xiàn)foo現(xiàn)在是全局變量了 alert( window.foo == "test" );
到目前應(yīng)該很明顯,盡管JavaScript的作用域不如塊作用域語(yǔ)言的嚴(yán)格,它還是相當(dāng)強(qiáng)大和有特色的。尤其是與下節(jié)中敘述的閉包的概念結(jié)合起來(lái)時(shí),JavaScript語(yǔ)言的強(qiáng)大將展露無(wú)遺。
出處:藍(lán)色理想
責(zé)任編輯:moby
上一頁(yè) 語(yǔ)言特性:函數(shù)重載和類型檢查 下一頁(yè) 語(yǔ)言特性:閉包
◎進(jìn)入論壇網(wǎng)頁(yè)制作、網(wǎng)站綜合版塊參加討論
|