英文原文: http://www.digital-web.com/articles/scope_in_javascript/
作用域(scope)是JavaScript語(yǔ)言的基石之一,在構(gòu)建復(fù)雜程序時(shí)也可能是最令我頭痛的東西。記不清多少次在函數(shù)之間傳遞控制后忘記 this關(guān)鍵字引用的究竟是哪個(gè)對(duì)象,甚至,我經(jīng)常以各種不同的混亂方式來曲線救國(guó),試圖偽裝成正常的代碼,以我自己的理解方式來找到所需要訪問的變量。
這篇文章將正面解決這個(gè)問題:簡(jiǎn)述上下文(context)和作用域的定義,分析可以讓我們掌控上下文的兩種方法,最后深入一種高效的方案,它能有效解決我所碰到的90%的問題。
我在哪兒?你又是誰(shuí)
JavaScript 程序的每一個(gè)字節(jié)都是在這個(gè)或那個(gè)運(yùn)行上下文(execution context)中執(zhí)行的。你可以把這些上下文想象為代碼的鄰居,它們可以給每一行代碼指明:從何處來,朋友和鄰居又是誰(shuí)。沒錯(cuò),這是很重要的信息,因?yàn)?JavaScript社會(huì)有相當(dāng)嚴(yán)格的規(guī)則,規(guī)定誰(shuí)可以跟誰(shuí)交往。運(yùn)行上下文則是有大門把守的社區(qū)而非其內(nèi)開放的小門。
我們通?梢园堰@些社會(huì)邊界稱為作用域,并且有充足的重要性在每一位鄰居的憲章里立法,而這個(gè)憲章就是我們要說的上下文的作用域鏈(scope chain)。在特定的鄰里關(guān)系內(nèi),代碼只能訪問它的作用域鏈內(nèi)的變量。與超出它鄰里的變量比起來,代碼更喜歡跟本地(local,即局部)的打交道。
具體地說,執(zhí)行一個(gè)函數(shù)會(huì)創(chuàng)建一個(gè)不同的運(yùn)行上下文,它會(huì)將局部作用域增加到它所定義的作用域鏈內(nèi)。JavaScript通過作用域鏈的局部向全局攀升方式,在特定的上下文中解析標(biāo)識(shí)符。這表示,本級(jí)變量會(huì)優(yōu)先于作用域鏈內(nèi)上一級(jí)擁有相同名字的變量。顯而易見,當(dāng)我的好友們一起談?wù)摗盡ike West”(本文原作者)時(shí),他們說的就是我,而非 bluegrass singer 或是 Duke professor , 盡管(按理說)后兩者著名多了。
讓我們看些例子來探索這些含義:
<script type="text/javascript"> var ima_celebrity = "Everyone can see me! I'm famous!", the_president = "I'm the decider!";
function pleasantville() { var the_mayor = "I rule Pleasantville with an iron fist!", ima_celebrity = "All my neighbors know who I am!";
function lonely_house() { var agoraphobic = "I fear the day star!", a_cat = "Meow."; } } </script>
我們的全明星,img_celebrity, 家喻戶曉(所有人都認(rèn)識(shí)她)。她在政治上積極活躍,敢于在一個(gè)相當(dāng)頻繁的基層上叫囂總統(tǒng)(即the_president)。她會(huì)為碰到的每一個(gè)人簽名和回答問題。就是說,她不會(huì)跟她的粉絲有私下的聯(lián)系。她相當(dāng)清楚粉絲們的存在 并有他們自己某種程度上的個(gè)人生活,但也可以肯定的是,她并不知道粉絲們?cè)诟陕,甚至連粉絲的名字都不知道。
而在歡樂市(pleasantville)內(nèi),市長(zhǎng)(the_mayor)是眾所周知的。她經(jīng)常在她的城鎮(zhèn)內(nèi)散步,跟她的選民聊天、握手并親吻小孩。因?yàn)闅g樂市(pleasantville)還算比較大且重要的鄰居,市長(zhǎng)在她辦公室內(nèi)放置一臺(tái)紅色電話,它是一條可以直通總統(tǒng)的7×24熱線。她還可以看到市郊外山上的孤屋(lonely_house),但從不在意里面住著的是誰(shuí)。
而孤屋(lonely_house)是一個(gè)自我的世界。曠恐患者時(shí)常在里面囔囔自語(yǔ),玩紙牌和喂養(yǎng)一個(gè)小貓(a_cat)。他偶爾會(huì)給市長(zhǎng)(the_mayor)打電話咨詢一些本地的噪音管制,甚至在本地新聞看到img_celebrity后會(huì)寫些粉絲言語(yǔ)給她(當(dāng)然,這是pleasantville內(nèi)的img_celebrity)。
出處:Realazy
責(zé)任編輯:moby
上一頁(yè) 下一頁(yè) JavaScript 中的作用域 [2]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|