深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域

深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域

ID:31651534

大?。?8.73 KB

頁數(shù):5頁

時間:2019-01-16

深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域_第1頁
深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域_第2頁
深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域_第3頁
深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域_第4頁
深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域_第5頁
資源描述:

《深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫

1、深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域這篇文章主要介紹了javascript作用域第二篇之詞法作用域和動態(tài)作用域的相關資料,非常不錯,具有參考借鑒價值,感興趣的朋友可以參考下前面的話大多數(shù)時候,我們對作用域產(chǎn)生混亂的主要原因是分不清楚應該按照函數(shù)位置的嵌套順序,還是按照函數(shù)的調(diào)用順序進行變量查找。再加上this機制的干擾,使得變量查找極易出錯。這實際上是由兩種作用域工作模型導致的,作用域分為詞法作用域和動態(tài)作用域,分清這兩種作用域模型就能夠?qū)ψ兞坎檎疫^程有清晰的認識。本文是深入理解javascript作用域系列第二篇詞法作用域

2、和動態(tài)作用域詞法作用域第一篇介紹過,編譯器的第一個工作階段叫作分詞,就是把由字符組成的字符串分解成詞法單元。這個概念是理解詞法作用域的基礎簡單地說,詞法作用域就是定義在詞法階段的作用域,是由寫代碼時將變量和塊作用域?qū)懺谀睦飦頉Q定的,因此當詞法分析器處理代碼時會保持作用域不變關系無論函數(shù)在哪里被調(diào)用,也無論它如何被調(diào)用,它的詞法作用域都只由函數(shù)被聲明時所處的位置決定functionfoo(a){varb=a*2;functionbar(c){console.log(a,b,c);}bar(b*3);}foo(2);//2412在這個例子中有三個逐級嵌套的

3、作用域。為了幫助理解,可以將它們想象成幾個逐級包含的氣泡作用域氣泡由其對應的作用域塊代碼寫在哪里決定,它們是逐級包含的氣泡1包含著整個全局作用域,其中只有一個標識符:foo氣泡2包含著foo所創(chuàng)建的作用域,其中有三個標識符:a、bar和b氣泡3包含著bar所創(chuàng)建的作用域,其中只有一個標識符:c查找作用域氣泡的結(jié)構(gòu)和互相之間的位置關系給引擎提供了足夠的位置信息,引擎用這些信息來查找標識符的位置在代碼片段中,引擎執(zhí)行console.log(...)聲明,并查找a、b和c三個變量的引用。它首先從最內(nèi)部的作用域,也就是bar(...)函數(shù)的作用域開始查找。引擎

4、無法在這里找到a,因此會去上一級到所嵌套的foo(???)的作用域中繼續(xù)查找。在這里找到了a,因此引擎使用了這個引用。對b來講也一樣。而對c來說,引擎在bar(...)中找到了它[注意]詞法作用域查找只會查找一級標識符,如果代碼引用了foo.bar.baz,詞法作用域查找只會試圖查找f00標識符,找到這個變量后,對象屬性訪問規(guī)則分別接管對bar和baz屬性的訪問foo={baz:1}};console.log(foo.bar?baz);//l遮蔽作用域查找從運行時所處的最內(nèi)部作用域開始,逐級向外或者說向上進行,直到遇見第一個匹配的標識符為止在多層的嵌套

5、作用域中可以定義同名的標識符,這叫作“遮蔽效應m內(nèi)部的標識符“遮蔽”了外部的標識符vara=O;functiontest(){vara=l;console?log(a);//l}test();全局變量會自動為全局對象的屬性,因此可以不直接通過全局對象的詞法名稱,而是間接地通過對全局對象屬性的引用來對其進行訪問vara=0;functiontest(){vara=1;console.log(window.a);//0}test();通過這種技術可以訪問那些被同名變量所遮蔽的全局變量。但非全局的變量如果被遮蔽了,無論如何都無法被訪問到動態(tài)作用域javasc

6、ript使用的是詞法作用域,它的最重要的特征是它的定義過程發(fā)生在代碼的書寫階段那為什么要介紹動態(tài)作用域呢?實際上動態(tài)作用域是javascript另一個重要機制this的表親。作用域混亂多數(shù)是因為詞法作用域和this機制相混淆,傻傻分不清楚動態(tài)作用域并不關心函數(shù)和作用域是如何聲明以及在任何處聲明的,只關心它們從何處調(diào)用。換句話說,作用域鏈是基于調(diào)用棧的,而不是代碼中的作用域嵌套vara=2;functionfooO{console.log(a);}functionbar(){vara=3;foo();}bar();[11如果處于詞法作用域,也就是現(xiàn)在的j

7、avascript環(huán)境。變量a首先在foo()函數(shù)中查找,沒有找到。于是順著作用域鏈到全局作用域中查找,找到并賦值為20所以控制臺輸出2【2】如果處于動態(tài)作用域,同樣地,變量a首先在foo()中查找,沒有找到。這里會順著調(diào)用棧在調(diào)用foo()函數(shù)的地方,也就是bar()函數(shù)中查找,找到并賦值為3。所以控制臺輸出3小結(jié):兩種作用域的區(qū)別,簡而言之,詞法作用域是在定義時確定的,而動態(tài)作用域是在運行時確定的以上所述是小編給大家介紹的深入理解javascript作用域第二篇之詞法作用域和動態(tài)作用域,希望對大家有所幫助

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。