技術(shù)人員求職必看之Javascript詞法作用域.doc_第1頁
技術(shù)人員求職必看之Javascript詞法作用域.doc_第2頁
技術(shù)人員求職必看之Javascript詞法作用域.doc_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

技術(shù)人員求職必看之Javascript詞法作用域每個人都會犯錯有時候孰能無過,過而能改,善莫大焉,有時候知道自己錯了卻沒有機(jī)會更改。其實,錯了并不僅僅是錯了,做錯了,除了及時改正和彌補(bǔ)之外,最重要的是為自己犯的錯承擔(dān)所有責(zé)任。2009年3月14日,我去參加網(wǎng)易互動的專場招聘會,應(yīng)聘網(wǎng)頁工程師的職位。有幸參加筆試,然后有幸栽在筆試,呵呵。廢話少說,抓出影響極深的一題重新研究研究。題目大概是:寫出如下代碼的輸出結(jié)果并進(jìn)行分析var tt = aa;function test()alert(tt);var tt = dd;alert(tt);test();“太簡單了!”這是我當(dāng)時看到這個題目是的第一想法,于是輕率答題竟成我的致命之傷。我的答案是aa和dd,解析:第一次輸出全局變量的結(jié)果,然后局部變量tt覆蓋全局變量所引用的值,所以第二次輸出結(jié)果是dd。任何人見我如此作答,都會認(rèn)為我是在掃盲想法及其幼稚(我也這么認(rèn)為)!網(wǎng)易啊,怎么可能會滿意于這種答案!正確的答案應(yīng)該是:undefined和dd為什么第一次alert的結(jié)果是undefined呢?要解釋得清楚明白需要用到Javascript的詞法作用域。Javascript中的函數(shù)“在定義它們的作用域里運(yùn)行,而不是在執(zhí)行它們的作用域里運(yùn)行”,這是權(quán)威指南里抽象而精辟的總結(jié)。Javascript的邏輯默認(rèn)在一個全局作用域中執(zhí)行,如以上程序段中的“var tt=aa;”就是定義一個全局作用域的全局變量(如果以上代碼段不是摘自某個函數(shù)鏈的話)。而test()函數(shù)內(nèi)部的邏輯必須在原有的作用域(全局作用域)鏈再添加test函數(shù)本身的作用域(局部性)這些思想幾乎在每一種語言中都是如此定義的,然而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)用對象不變,當(dāng)外部函數(shù)執(zhí)行完畢后所有數(shù)據(jù)(包括外部函數(shù)和嵌套的內(nèi)部函數(shù))都將被垃圾回收機(jī)制收集這一點還不能體現(xiàn)出閉包的精華。有一種情況,就是Javascript允許外部調(diào)用嵌套的內(nèi)部函數(shù),即使被嵌套函數(shù)已經(jīng)被垃圾收集最常見的就是在某個函數(shù)中用其嵌套的內(nèi)部函數(shù)定義某些元素的響應(yīng)事件,頁面載入的時候被嵌套函數(shù)(某個函數(shù))已經(jīng)執(zhí)行完畢(被垃圾回收),但當(dāng)事件觸發(fā)的時候仍然會有響應(yīng)的動作,而且響應(yīng)函數(shù)中還可能調(diào)用到在被嵌套函數(shù)(某個函數(shù))中定義的變量最終值(不是被垃圾回收了嗎?)。關(guān)于閉包的知識和示例有很多資料可供查詢,我不想敘述。本文的重點是以下非常重要的細(xì)節(jié):調(diào)用對象位于作用域鏈的前端,局部變量(在函數(shù)內(nèi)部用var聲明的變量)、函數(shù)參數(shù)及Arguments對象都在函數(shù)內(nèi)的作用域中這意味著它們隱藏了作用域鏈更上層的任何同名的屬性。即,在以上程序片段中,test函數(shù)內(nèi)部的“var tt=dd”將會致使“var tt=aa”在test函數(shù)被調(diào)用時完全被隱藏。而且,tt是在第一個alert語句之后定義,所以在調(diào)用到第一個alert時,tt是還沒有被賦值的。這樣說可能會清楚一點,即,在定義test函數(shù)時,當(dāng)定義第一個alert(tt)時,這里會記錄tt是作用域鏈中的一個變量但不會記錄它(tt)的值,函數(shù)定義完畢后tt就添加到作用域里,所以第一個alert語句能夠找到該作用域里的tt(即,相當(dāng)于找到一個已經(jīng)在函數(shù)內(nèi)部聲明,但未被賦值的tt)。以上程序片段的執(zhí)行結(jié)果與以下片段的結(jié)果相同:var tt = aa;function test()var tt;alert(tt);tt = dd;alert(tt);test();Javascript的作用域不可簡單的用C+等語言的思維來理解?。+在調(diào)用函數(shù)之前必須先聲明或定義,而Javascript沒必要。在Javascript中可以先調(diào)用函數(shù),后再定義(不用在調(diào)用之前作任何聲明)。因為在調(diào)用函數(shù)時,Javascript是向作用域鏈要函數(shù)的定義(函數(shù)在定義它們的作用域里運(yùn)行,而不是在執(zhí)行它們的作用域里運(yùn)行)如以上代碼寫成:var tt = aa;test(); /先調(diào)用后再定義function test()alert(tt); /undefinedvar tt = dd;alert(tt); /dd以上代碼片段雖然能夠得到相同的結(jié)果,但最好不要那樣寫啦,習(xí)慣不好,代碼不好維護(hù)。 重申一下本文的重點:函數(shù)在定義它們的作用域里運(yùn)行,而不是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論