


全文預(yù)覽已結(jié)束
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
技術(shù)人員求職必看之Javascript詞法作用域每個(gè)人都會(huì)犯錯(cuò)有時(shí)候孰能無(wú)過(guò),過(guò)而能改,善莫大焉,有時(shí)候知道自己錯(cuò)了卻沒(méi)有機(jī)會(huì)更改。其實(shí),錯(cuò)了并不僅僅是錯(cuò)了,做錯(cuò)了,除了及時(shí)改正和彌補(bǔ)之外,最重要的是為自己犯的錯(cuò)承擔(dān)所有責(zé)任。2009年3月14日,我去參加網(wǎng)易互動(dòng)的專場(chǎng)招聘會(huì),應(yīng)聘網(wǎng)頁(yè)工程師的職位。有幸參加筆試,然后有幸栽在筆試,呵呵。廢話少說(shuō),抓出影響極深的一題重新研究研究。題目大概是:寫(xiě)出如下代碼的輸出結(jié)果并進(jìn)行分析var tt = aa;function test()alert(tt);var tt = dd;alert(tt);test();“太簡(jiǎn)單了!”這是我當(dāng)時(shí)看到這個(gè)題目是的第一想法,于是輕率答題竟成我的致命之傷。我的答案是aa和dd,解析:第一次輸出全局變量的結(jié)果,然后局部變量tt覆蓋全局變量所引用的值,所以第二次輸出結(jié)果是dd。任何人見(jiàn)我如此作答,都會(huì)認(rèn)為我是在掃盲想法及其幼稚(我也這么認(rèn)為)!網(wǎng)易啊,怎么可能會(huì)滿意于這種答案!正確的答案應(yīng)該是:undefined和dd為什么第一次alert的結(jié)果是undefined呢?要解釋得清楚明白需要用到Javascript的詞法作用域。Javascript中的函數(shù)“在定義它們的作用域里運(yùn)行,而不是在執(zhí)行它們的作用域里運(yùn)行”,這是權(quán)威指南里抽象而精辟的總結(jié)。Javascript的邏輯默認(rèn)在一個(gè)全局作用域中執(zhí)行,如以上程序段中的“var tt=aa;”就是定義一個(gè)全局作用域的全局變量(如果以上代碼段不是摘自某個(gè)函數(shù)鏈的話)。而test()函數(shù)內(nèi)部的邏輯必須在原有的作用域(全局作用域)鏈再添加test函數(shù)本身的作用域(局部性)這些思想幾乎在每一種語(yǔ)言中都是如此定義的,然而Javascript作用域鏈的特別之處在于函數(shù)內(nèi)部能夠嵌套函數(shù)的定義(這是閉包的基礎(chǔ)。注:在JS中函數(shù)是唯一形式的代碼作用域)嵌套的內(nèi)部函數(shù)可以調(diào)用外部函數(shù)(被嵌套的函數(shù))的變量和其他嵌套函數(shù)(函數(shù)是一種數(shù)據(jù))。如果是在外部函數(shù)內(nèi)調(diào)用嵌套函數(shù),那么調(diào)用對(duì)象不變,當(dāng)外部函數(shù)執(zhí)行完畢后所有數(shù)據(jù)(包括外部函數(shù)和嵌套的內(nèi)部函數(shù))都將被垃圾回收機(jī)制收集這一點(diǎn)還不能體現(xiàn)出閉包的精華。有一種情況,就是Javascript允許外部調(diào)用嵌套的內(nèi)部函數(shù),即使被嵌套函數(shù)已經(jīng)被垃圾收集最常見(jiàn)的就是在某個(gè)函數(shù)中用其嵌套的內(nèi)部函數(shù)定義某些元素的響應(yīng)事件,頁(yè)面載入的時(shí)候被嵌套函數(shù)(某個(gè)函數(shù))已經(jīng)執(zhí)行完畢(被垃圾回收),但當(dāng)事件觸發(fā)的時(shí)候仍然會(huì)有響應(yīng)的動(dòng)作,而且響應(yīng)函數(shù)中還可能調(diào)用到在被嵌套函數(shù)(某個(gè)函數(shù))中定義的變量最終值(不是被垃圾回收了嗎?)。關(guān)于閉包的知識(shí)和示例有很多資料可供查詢,我不想敘述。本文的重點(diǎn)是以下非常重要的細(xì)節(jié):調(diào)用對(duì)象位于作用域鏈的前端,局部變量(在函數(shù)內(nèi)部用var聲明的變量)、函數(shù)參數(shù)及Arguments對(duì)象都在函數(shù)內(nèi)的作用域中這意味著它們隱藏了作用域鏈更上層的任何同名的屬性。即,在以上程序片段中,test函數(shù)內(nèi)部的“var tt=dd”將會(huì)致使“var tt=aa”在test函數(shù)被調(diào)用時(shí)完全被隱藏。而且,tt是在第一個(gè)alert語(yǔ)句之后定義,所以在調(diào)用到第一個(gè)alert時(shí),tt是還沒(méi)有被賦值的。這樣說(shuō)可能會(huì)清楚一點(diǎn),即,在定義test函數(shù)時(shí),當(dāng)定義第一個(gè)alert(tt)時(shí),這里會(huì)記錄tt是作用域鏈中的一個(gè)變量但不會(huì)記錄它(tt)的值,函數(shù)定義完畢后tt就添加到作用域里,所以第一個(gè)alert語(yǔ)句能夠找到該作用域里的tt(即,相當(dāng)于找到一個(gè)已經(jīng)在函數(shù)內(nèi)部聲明,但未被賦值的tt)。以上程序片段的執(zhí)行結(jié)果與以下片段的結(jié)果相同:var tt = aa;function test()var tt;alert(tt);tt = dd;alert(tt);test();Javascript的作用域不可簡(jiǎn)單的用C+等語(yǔ)言的思維來(lái)理解啊!C+在調(diào)用函數(shù)之前必須先聲明或定義,而Javascript沒(méi)必要。在Javascript中可以先調(diào)用函數(shù),后再定義(不用在調(diào)用之前作任何聲明)。因?yàn)樵谡{(diào)用函數(shù)時(shí),Javascript是向作用域鏈要函數(shù)的定義(函數(shù)在定義它們的作用域里運(yùn)行,而不是在執(zhí)行它們的作用域里運(yùn)行)如以上代碼寫(xiě)成:var tt = aa;test(); /先調(diào)用后再定義function test()alert(tt); /undefinedvar tt = dd;alert(tt); /dd以上代碼片段雖然能夠得到相同的結(jié)果,但最好不要那樣寫(xiě)啦,習(xí)慣不好,代碼不好維護(hù)。 重申一下本文的重點(diǎn):函數(shù)在定義它們的作用域里運(yùn)行,而不是
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 橋面鋪裝激光整平機(jī)技術(shù)解析與應(yīng)用
- 腫瘤抗體研究與應(yīng)用進(jìn)展
- 2024年福建廈門(mén)市蘇頌醫(yī)院補(bǔ)充工作人員招聘105人筆試考點(diǎn)考試題庫(kù)與答案
- 春節(jié)節(jié)前安全檢查與假日安全提示
- 2024年高考押題-歷史
- 收費(fèi)站月工作總結(jié)
- 直腸惡性腫瘤疾病查房
- 腫瘤放療護(hù)理查房
- 2025社區(qū)獲得性肺炎防治進(jìn)展
- 支原體肺炎院感防控要點(diǎn)
- 2024年吉林省長(zhǎng)春市中考地理試卷(含答案與解析)
- 室外光纖布線施工合同協(xié)議書(shū)
- 2025版新教材高中語(yǔ)文第二輪復(fù)習(xí)專題練-專題六 語(yǔ)言文字運(yùn)用(含答案)
- 2024年甘肅蘭州市西固區(qū)選聘專職化村黨組織書(shū)記1人歷年(高頻重點(diǎn)提升專題訓(xùn)練)共500題附帶答案詳解
- 電機(jī)學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年?yáng)|北電力大學(xué)
- 《凈水絮凝劑》課件
- 護(hù)欄網(wǎng)施工方案
- 西藏2021年中考數(shù)學(xué)真題試卷(含答案)
- 沂蒙紅色文化與沂蒙精神智慧樹(shù)知到期末考試答案章節(jié)答案2024年臨沂大學(xué)
- 中國(guó)地理(廣州大學(xué))智慧樹(shù)知到期末考試答案章節(jié)答案2024年廣州大學(xué)
- 校園超市經(jīng)營(yíng)投標(biāo)方案(技術(shù)方案)
評(píng)論
0/150
提交評(píng)論