摘要:理解作用域演員表首先介紹將要參與到對程序進行處理的過程中的演員們,這樣才能理解接下來將要聽到的對話。查找的過程由作用域進行協(xié)助,但是引擎執(zhí)行怎樣的查找,會影響最終的查找結果。
幾乎所有編程語言最基本的功能之一,就是能夠存儲變量當中的值,并能在之后對這個值進行訪問或修改。事實上,正是這種存儲和訪問變量的值的能力將狀態(tài)帶給了程序。
但是將變量引入程序會引起幾個很有意思的問題,也正是我們將要討論的:
這些變量住在哪里?換句話說,它們存儲在哪里?最重要的是,程序需要時如何找到它們?
這些問題說明需要一套設計良好的規(guī)則來存儲變量,并且之后可以方便地找到這些變量。這套規(guī)則被稱為作用域。
編譯原理盡管通常將JavaScript歸類為“動態(tài)”或“解釋執(zhí)行”語言,但事實上它是一門編譯語言。
但與傳統(tǒng)的編譯語言不同,它不是提前編譯的,編譯結果也不能在分布式系統(tǒng)中進行移植。
比起那些編譯過程只有三個步驟的語言的編譯器,JavaScript引擎要復雜得多。例如,在語法分析和代碼生成階段有特定的步驟來對性能進行優(yōu)化,包括對冗余元素進行優(yōu)化等。
首先,JavaScript引擎不會有大量的時間來進行優(yōu)化,因為與其他語言不通,JavaScript的編譯過程不是發(fā)生在構建之前的。
對于JavaScript來說,大部分情況下編譯發(fā)生在代碼執(zhí)行前的幾微妙的時間內。在我們所要討論的作用域的背后,JavaScript引擎用盡了各種方法(比如JIT,可以延遲編譯甚至實施重新編譯)來保證性能最佳。
簡單地說,任何JavaScript代碼片段在執(zhí)行前都要進行編譯(通常就在執(zhí)行前)。
理解作用域 演員表首先介紹將要參與到對程序 var a = 2;進行處理的過程中的演員們,這樣才能理解接下來
將要聽到的對話。
引擎
從頭到尾負責整個JavaScript程序的編譯及執(zhí)行過程。
編譯器
引擎的好朋友之一,負責語法分析及代碼生成等臟活累活
作用域
引擎的另一位好朋友,負責收集并維護由所有聲明的標識符組成的一系列查詢,并實施一套非常嚴格的規(guī)則,確定當前執(zhí)行的代碼對這些標識符的訪問權限。
對話當你看見var a=2;這段程序時,很可能認為這是一句聲明。但我們的新朋友引擎卻不這么看。
事實上,引擎認為這里有兩個完全不同的聲明,一個由編譯器在編譯時處理,另一個則由引擎在運行時處理。
變量的賦值操作會執(zhí)行兩個動作,首先編譯器會在當前作用域中聲明一個變量,然后在運行時引擎會在作用域中查找該變量,如果能夠找到就會對它賦值。
編譯器有話說編譯器在編譯過程的第二步代碼中生成了代碼,引擎執(zhí)行它時,會通過查找變量a來判斷它是否已聲明過。查找的過程由作用域進行協(xié)助,但是引擎執(zhí)行怎樣的查找,會影響最終的查找結果。
在上面的例子中,引擎會為變量a進行LHS查詢。另外一個查找的類型叫作RHS.換句話說,當變量出現(xiàn)在賦值操作的左側時進行LHS查詢,出現(xiàn)在右側時進行RHS查詢。
講的更準確一點,RHS查詢與簡單地查找某個變量的值別無二致,而LHS查詢則是試圖找到變量的容器本身,從而可以對其賦值。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/107187.html
摘要:作用域作用域是指程序源代碼中定義變量的區(qū)域。采用詞法作用域,也就是靜態(tài)作用域。而與詞法作用域相對的是動態(tài)作用域,函數的作用域是在函數調用的時候才決定的。前面我們已經說了,采用的是靜態(tài)作用域,所以這個例子的結果是。 JavaScript深入系列的第二篇,JavaScript采用詞法作用域,什么語言采用了動態(tài)作用域?兩者的區(qū)別又是什么?還有一個略難的思考題,快來看看吧。 作用域 作用域是指...
摘要:也毫不例外,但在中作用域的特性與其他高級語言稍有不同,這是很多學習者久久難以理清的一個核心知識點。主要使用的是函數作用域。 關于作用域:About Scope 作用域是程序設計里的基礎特性,是作用域使得程序運行時可以使用變量存儲值、記錄和改變程序的狀態(tài)。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性與其他高級語言稍有不同,這是很多學習者久久難以理清的一個核...
摘要:講作用域鏈首先要從作用域講起,下面是百度百科里對作用域的定義作用域在許多程序設計語言中非常重要。原文出處談談語法里一些難點問題二 3) 作用域鏈相關的問題 作用域鏈是javascript語言里非常紅的概念,很多學習和使用javascript語言的程序員都知道作用域鏈是理解javascript里很重要的一些概念的關鍵,這些概念包括this指針,閉包等等,它非常紅的另一個重要原因就...
摘要:全局作用域局部作用域局部作用域全局作用域局部作用域塊語句沒有塊級作用域塊級聲明包括和,以及和循環(huán),和函數不同,它們不會創(chuàng)建新的作用域。局部作用域只在該函數調用執(zhí)行期間存在。 一、什么是作用域? 作用域是你的代碼在運行時,各個變量、函數和對象的可訪問性。(可產生作用的區(qū)域) 二、JavaScript中的作用域 在 JavaScript 中有兩種作用域 全局作用域 局部作用域 當變量定...
摘要:在中的應用采用詞法作用域,也就是靜態(tài)作用域。那什么又是詞法作用域或者靜態(tài)作用域呢請繼續(xù)往下看靜態(tài)作用域與動態(tài)作用域因為采用的是詞法作用域函數的作用域在函數定義的時候就決定了。 開篇 當我們在開始學習任何一門語言的時候,都會接觸到變量的概念,變量的出現(xiàn)其實是為了解決一個問題,為的是存儲某些值,進而,存儲某些值的目的是為了在之后對這個值進行訪問或者修改,正是這種存儲和訪問變量的能力將狀態(tài)給...
閱讀 1180·2021-11-25 09:43
閱讀 3004·2019-08-30 15:54
閱讀 3378·2019-08-30 15:54
閱讀 3032·2019-08-30 15:44
閱讀 1674·2019-08-26 12:18
閱讀 2279·2019-08-26 11:42
閱讀 898·2019-08-26 11:35
閱讀 3317·2019-08-23 18:22