資源描述:
《javascript中的作用域--.》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、JavaScript中的作用域>>.英文原文:articles/scope_in_javascript/作用域(scope)是JavaScript語言的基石之一,在構(gòu)建復(fù)雜程序時也可能是最令我頭痛的東西。記不清多少次在函數(shù)之間傳遞控制后忘記this關(guān)鍵字引用的究竟是哪個對象,甚至,我經(jīng)常以各種不同的混亂方式來曲線救國,試圖偽裝成正常的代碼,以我自己的理解方式來找到所需要訪問的變量。這篇文章將正面解決這個問題:簡述上下文(context)和作用域的定義,分析可以讓我們掌控上下文的兩種方法,最后深入一種高效的
2、方案,它能有效解決我所碰到的90%的問題。我在哪兒?你又是誰JavaScript程序的每一個字節(jié)都是在這個或那個運行上下文(executioncontext)中執(zhí)行的。你可以把這些上下文想象為代碼的鄰居,它們可以給每一行代碼指明:從何處來,朋友和鄰居又是誰。沒錯,這是很重要的信息,因為JavaScript社會有相當嚴格的規(guī)則,規(guī)定誰可以跟誰交往。運行上下文則是有大門把守的社區(qū)而非其內(nèi)開放的小門。我們通??梢园堰@些社會邊界稱為作用域,并且有充足的重要性在每一位鄰居的憲章里立法,而這個憲章就是我們要說的上下文
3、的作用域鏈(scopechain)。在特定的鄰里關(guān)系內(nèi),代碼只能訪問它的作用域鏈內(nèi)的變量。與超出它鄰里的變量比起來,代碼更喜歡跟本地(local,即局部)的打交道。具體地說,執(zhí)行一個函數(shù)會創(chuàng)建一個不同的運行上下文,它會將局部作用域增加到它所定義的作用域鏈內(nèi)。JavaScript通過作用域鏈的局部向全局攀升方式,在特定的上下文中解析標識符。這表示,本級變量會優(yōu)先于作用域鏈內(nèi)上一級擁有相同名字的變量。顯而易見,當我的好友們一起談?wù)摗盡ikeeoa_celebrity="Everyonecanseeme!I'm
4、famous!",the_president="I'mthedecider!";functionpleasantville(){varthe_mayor="IrulePleasantvillea_celebrity="Allmyneighborskno!";functionlonely_house(){varagoraphobic="Ifearthedaystar!",a_cat="Meog_celebrity,家喻戶曉(所有人都認識她)。她在政治上積極活躍,敢于在一個相當頻繁的基層上叫囂總統(tǒng)(即the_
5、president)。她會為碰到的每一個人簽名和回答問題。就是說,她不會跟她的粉絲有私下的聯(lián)系。她相當清楚粉絲們的存在并有他們自己某種程度上的個人生活,但也可以肯定的是,她并不知道粉絲們在干嘛,甚至連粉絲的名字都不知道。而在歡樂市(pleasantville)內(nèi),市長(the_mayor)是眾所周知的。她經(jīng)常在她的城鎮(zhèn)內(nèi)散步,跟她的選民聊天、握手并親吻小孩。因為歡樂市(pleasantville)還算比較大且重要的鄰居,市長在她辦公室內(nèi)放置一臺紅色,它是一條可以直通總統(tǒng)的7×24熱線。她還可以看到市郊外山
6、上的孤屋(lonely_house),但從不在意里面住著的是誰。而孤屋(lonely_house)是一個自我的世界。曠恐患者時常在里面囔囔自語,玩紙牌和喂養(yǎng)一個小貓(a_cat)。他偶爾會給市長(the_mayor)打咨詢一些本地的噪音管制,甚至在本地新聞看到img_celebrity后會寫些粉絲言語給她(當然,這是pleasantville內(nèi)的img_celebrity)。this?那是蝦米?每一個運行上下文除了建立一個作用域鏈外,還提供一個名為this的關(guān)鍵字。它的普遍用法是,this作為一個獨特的功
7、能,為鄰里們提供一個可訪問到它的途徑。但總是依賴于這個行為并不可靠:取決于我們?nèi)绾芜M入一個特定鄰居的具體情況,this表示的完全可能是其他東西。事實上,我們?nèi)绾芜M去鄰居家本身,通常恰恰就是this所指。有四種情形值得特別注意:呼叫對象的方法在經(jīng)典的面向?qū)ο缶幊讨?,我們需要識別和引用當前對象。this極好地扮演了這個角色,為我們的對象提供了自我查找的能力,并指向它們本身的屬性。<scripttype="text/javascript">123下一頁[這篇文章來自..,]vardeep_thought=
8、{the_anseaning=deep_thought.ask_question();</script><scripttype="text/javascript">vardeep_thought={the_anseaning=deep_thought.ask_question();</script>這個例子建立了一個名為deep_thought的對象,設(shè)置其屬性the_ansethod)。當deep_thou