亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

javascript作用域鏈(Scope Chain)用法實例解析

2024-05-06 16:25:31
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了javascript作用域鏈(Scope Chain)用法,結合實例形式較為詳細的分析了javascript作用域鏈(Scope Chain)的概念、功能與相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
 

本文實例分析了javascript作用域鏈(Scope Chain)用法。分享給大家供大家參考,具體如下:

關于js的作用域鏈,早有耳聞,也曾看過幾篇介紹性的博文,但一直都理解的模棱兩可。近日又精心翻看了一下《悟透Javascript》這本書,覺得寫得太深刻,在“代碼的時空”一節里有一段介紹作用域鏈的地方寥寥數語,回味無窮(其實還是理解的模棱兩可^_^)?,F在整理下自己的讀書筆記,順便借鑒網上資源,寫下來。

一、從一個簡單的問題說起

下面的js代碼在頁面中運行顯示什么結果:

var arg = 1;function fucTest(arg) {  alert(arg);  var arg = 2;  //alert(arg);}fucTest(10);

您的答案是什么?沒錯,就是彈出10。我的理解是這樣的,funTest函數有一個形參arg,funTest函數傳入實參10,alert方法把10彈出就是了,囧。
好,問題又來了:

var arg = 1;function funcTest() {  alert(arg);  var arg = 2;}arg = 10;funcTest();

答案是什么?如果是5年前的我,肯定不會再往下想了,還是10!這么簡單的問題還用想什么呀?我的理解是這樣的:funTest函數是一個無參數的函數,函數內部通過alert方法,調用外部(全局)的變量arg,在函數執行前,arg賦值為10,彈出arg值后改變arg值為2,所以彈出值為10。

真的是10嗎?是還是不是?

測試的結果:彈出“undefined”,瀑布汗.

二、理解作用域鏈,從javascript運行機制說起

1、js的運行順序

如果一個文檔流中包含多個script代碼段(用script標簽分隔的js代碼或引入的js文件),它們的運行順序是:

步驟1. 讀入第一個代碼段(js執行引擎并非一行一行地執行程序,而是一段一段地分析執行的)
步驟2. 做語法分析,有錯則報語法錯誤(比如括號不匹配等),并跳轉到步驟5
步驟3. 對var變量和function定義做“預解析”(永遠不會報錯的,因為只解析正確的聲明)
步驟4. 執行代碼段,有錯則報錯(比如變量未定義)
步驟5. 如果還有下一個代碼段,則讀入下一個代碼段,重復步驟2
步驟6. 結束

上面的分析已經足夠清楚,步驟二、三和步驟四里的紅色字體可能是我們新手理解上的一個盲點,尤其是步驟三的“預解析”,如果不清楚什么叫預解析,總覺得不踏實。而步驟四的“有錯則報錯”也是經常碰到的。舉例來說:

function funcTest() {  alert(arg);  var arg = 2;}funcTest();

上面這段代碼執行時,彈出“undefined”,也就是說arg沒有定義,js的變量不是不用定義也可以嗎?

2、語法分析和“預解析”

(1)、從解釋型語言的編譯過程說起

眾所周知,javascript是解釋型語言,它不同于c#和java等編譯型語言。對于傳統編譯型語言來說,編譯步驟分為:詞法分析、語法分析、語義檢查、代碼優化和字節生成;但對于解釋型語言來說,通過詞法分析和語法分析得到語法樹后,就可以開始解釋執行了。

a、詞法分析

簡單地說,詞法分析是將字符流(char stream)轉換為記號流(token stream)。
但是這個轉換過程并不是可以用一句話就可以概括的那么簡單,我們可以試著用偽代碼理解一段簡單的程序:

代碼var result=x-y;的轉換大致可以表示如下:

NAME "result"
EQUALS
NAME "x"
MINUS
NAME "y"
SEMICOLON

b、語法分析

簡單地說,語法分析就是為了構造合法的語法分析樹,而語法分析樹可以直觀地表示出推導的過程。

那么什么是語法分析樹?簡單地說,就是程序推導過程的描述。但是到底什么是語法樹,請參考專業文章,本篇略過。

c、其他

通過語法分析,構造出語法分析樹后,接下來還可能需要進一步的語義檢查。對于傳統強類型語言來說,語義檢查的主要部分是類型檢查,比如函數的實參和形參類型是否匹配等等。
結論:通過上面的分析可以看出,對于javascript引擎來說,肯定有詞法分析和語法分析,之后可能還有語義檢查、代碼優化等步驟,等這些編譯步驟完成之后(任何語言都有編譯過程,只是解釋型語言沒有編譯成二進制代碼),才會開始執行代碼。

(2)、執行過程

a、javascript的作用域機制

通過編譯,javascript代碼已經翻譯成了語法樹,然后會立刻按照語法樹執行。

進一步的執行過程,需要理解javascript的作用域機制:詞法作用域(lexcical scope)。通俗地講,就是javascript變量的作用域是在定義時決定而不是執行時決定,也就是說詞法作用域取決于源碼,編譯器通過靜態分析就能確定,因此詞法作用域也叫做靜態作用域(static scope)。但需要注意,with和eval的語義無法僅通過靜態技術實現,所以只能說javascript的作用域機制非常接近詞法作用域(lexical scope).

javascript引擎在執行每個函數實例時,都會創建一個執行環境(execution context)。執行環境中包含一個調用對象(call object), 調用對象是一個scriptObject結構(scriptObject是與函數相關的一套靜態系統,與函數實例的生命周期保持一致),用來保存內部變量表varDecls、內嵌函數表funDecls、父級引用列表upvalue等語法分析結構(注意varDecls和funDecls等信息是在語法分析階段就已經得到,并保存在語法樹中。函數實例執行時,會將這些信息從語法樹復制到scriptObject上)。

b、javascript作用域機制的實現方法

詞法作用域(lexical scope)是javascript的作用域機制,還需要理解它的實現方法,就是作用域鏈(scope chain)。作用域鏈是一個name lookup機制,首先在當前執行環境的scriptObject中尋找,沒找到,則順著upvalue到父scriptObject中尋找,一直lookup到全局調用對象(global object)。

現在回過頭來分析第二個問題:

var arg = 1;function funcTest() {  alert(arg);  var arg = 2;}arg = 10;funcTest();

在執行funcTest函數時,也即進入了funcTest對應的作用域,js引擎在執行時,當遇到對變量名或者函數名的使用時,會首先在當前作用域(也即funcTest對應的作用域)查找變量或者函數(顯然,arg變量在funcTest對應的作用域里被定義為var arg=2 所以alert方法的參數采用的是當前作用域的arg,但是因為arg被定義在alert方法后,所以arg變量默認值為undefined)。當然,如果沒有找到就到上層作用域查找,依此類推(作用域范圍可以持續到javascript運行環境的根:window對象)。

最后,讓你看的更清楚,上面的代碼其實可以等價于:

var arg = 1;function funcTest() {  var arg; //默認值undefined  alert(arg);  arg = 2;}arg = 10;funcTest();

c、閉包(closure)

當一個函數實例執行時,會創建或關聯到一個閉包。 (關于閉包,打算另寫一篇學習筆記)

scriptObject用來靜態保存與函數相關的變量表,閉包則在執行期動態保存這些變量表及其運行值;

閉包的生命周期有可能比函數實例長。函數實例在活動引用為空后會自動銷毀;

閉包則要等要數據引用為空后,由javascript引擎回收(有些情況下不會自動回收,就導致了內存泄漏)。

ps:關于“執行過程”這一段比較拗口,名詞很多,不過別被它們嚇住,一旦理解了執行環境(execution context)、調用對象(call object)、詞法作用域(lexical scope)、作用域鏈(scope chain)、閉包(closure)等這些概念,javascript的很多現象都能迎刃而解。

三、結語

通過第二段的分析,對照第一段筆者曾經做出的判斷(你是不是也覺得筆者曾經的分析和結論很幼稚(哪怕有時結果碰巧也對?。?!不是一般的膚淺啊,^_^),你會發現原來javascript還有這么多“玄機”,而要真正理解精通又談何容易?先“悟透”再說吧。

希望本文所述對大家JavaScript程序設計有所幫助。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品99久久久久久人| 国产精品igao视频| 亚洲少妇中文在线| 欧美性猛交xxxxx免费看| 日韩av免费看| 日本一区二区在线免费播放| 日本一区二区在线播放| 97色伦亚洲国产| 成人激情黄色网| 成人黄色av网| 亚洲国产日韩欧美在线图片| 欧美成人午夜影院| 91九色蝌蚪国产| 中文字幕在线成人| 久久精品国产成人| 国产精品第二页| 秋霞成人午夜鲁丝一区二区三区| 国语自产精品视频在线看抢先版图片| 国产香蕉精品视频一区二区三区| 国产成人a亚洲精品| 日韩一区二区三区在线播放| 一区二区三区高清国产| 亚洲国产精品中文| 成人免费看吃奶视频网站| 91久久精品国产91久久性色| 亚洲a在线观看| 亚洲国产精品久久久久秋霞不卡| 精品久久久精品| 91精品久久久久久久久久久| 91中文在线视频| 亚洲人成电影网站色…| 欧美中文在线视频| 最近2019中文免费高清视频观看www99| 日韩电影免费在线观看中文字幕| 日韩精品极品在线观看播放免费视频| 久久久精品视频成人| 日韩精品视频免费专区在线播放| 亚洲国产精品电影在线观看| 91av视频导航| 欧美激情视频网站| 色小说视频一区| 欧美成人免费视频| 亚洲片av在线| 亚洲最大福利视频网| 亚洲人成毛片在线播放| 中文字幕自拍vr一区二区三区| 亚洲欧洲日韩国产| 国产主播欧美精品| 国产精品久久久久91| 日韩麻豆第一页| 最新69国产成人精品视频免费| 久久综合国产精品台湾中文娱乐网| 国产成人精品999| 日韩欧美精品在线观看| 久久综合免费视频影院| 日韩在线视频免费观看| 久久久成人av| 91久久久在线| 国产精品久久久久不卡| 国产精品美女在线观看| 国产精品视频色| 亚洲最新av在线网站| 国产一区二区激情| 亚洲精品日韩欧美| 欧美午夜性色大片在线观看| 日本一区二区在线播放| 国产精品视频区1| 国产日韩换脸av一区在线观看| 国产精品久久久久久久7电影| 国产精品久久久久久久久久免费| 欧美大片在线影院| 亚洲男人av电影| 成人美女免费网站视频| 国产91免费看片| 亚洲视频电影图片偷拍一区| 日韩的一区二区| 日韩免费高清在线观看| 中文字幕亚洲色图| 亚洲iv一区二区三区| 亚洲第一福利视频| 久久久久这里只有精品| 国产亚洲精品一区二区| 亚洲欧洲视频在线| 成人黄色在线观看| 色综合亚洲精品激情狠狠| 91久久精品美女高潮| 91天堂在线视频| 日韩网站免费观看| 91精品综合久久久久久五月天| 伊人久久精品视频| 日韩亚洲在线观看| 国产在线一区二区三区| 黑人巨大精品欧美一区二区免费| 国产色综合天天综合网| 国产成人一区二区三区小说| 亚洲欧美日韩综合| 福利视频导航一区| 欧美极品少妇xxxxⅹ喷水| 欧美夜福利tv在线| 亚洲第一av在线| 在线免费看av不卡| 亚洲伊人一本大道中文字幕| 亚洲色图美腿丝袜| 欧美黑人一区二区三区| 国产精品久久91| 国产精品国产三级国产aⅴ浪潮| 亚洲国产成人av在线| 亚洲97在线观看| 亚洲天堂成人在线| 欧美日韩激情视频8区| 国产精品美女www| 欧洲永久精品大片ww免费漫画| 久久久久日韩精品久久久男男| 久久久精品视频在线观看| 日本免费久久高清视频| 亚洲а∨天堂久久精品喷水| 精品一区精品二区| 欧美最猛性xxxxx免费| 国产精品xxx视频| 4438全国亚洲精品在线观看视频| 插插插亚洲综合网| 中文一区二区视频| 欧美日韩中文字幕日韩欧美| 日韩午夜在线视频| 欧美午夜影院在线视频| 日韩激情视频在线播放| 亚洲老头老太hd| 久久久精品欧美| 高清欧美一区二区三区| 国产精品女视频| 亚洲国产婷婷香蕉久久久久久| 成人激情在线播放| 精品一区二区三区四区| 亚洲伊人久久综合| 亚洲黄一区二区| 成人午夜在线观看| 久久久亚洲欧洲日产国码aⅴ| 亚洲精品一区二区网址| 成人午夜在线影院| 亚洲电影免费观看高清完整版在线观看| 日韩欧美在线一区| 国产精品久久久久久网站| 亚洲欧美成人精品| 久久久久久亚洲| 亚洲精品美女在线观看| 姬川优奈aav一区二区| 欧美一级电影在线| 日韩视频在线免费观看| 91社区国产高清| www.日韩不卡电影av| 国产偷国产偷亚洲清高网站| 日韩视频欧美视频| 国产精品免费久久久久影院| 91在线高清视频| 亚洲国产精品中文| 亚洲人成77777在线观看网| 日本最新高清不卡中文字幕| 亚洲欧洲日韩国产| 亚洲天堂av在线播放| 久久精品中文字幕免费mv| 久久综合久久美利坚合众国| 国内精品久久久久| 欧洲亚洲在线视频| 91在线观看免费观看|