作用域作為一個最基礎的功能存在於各種程式語言中,它使得我們的程式設計更加靈活有趣。其基礎功能就是儲存變數中的值,然後可以對值進行存取和修改。
可能我們都知道作用域的一些概念,以及其一些擴展的一些內容閉包等,但是相對於這些可能我們去了解這些變數到底是存到了哪裡,而我們的程式是如何存取他們的會更加有趣。
var a = 1;
首先我們要了解到在我們進行宣告變數並進行賦值的時候到底誰參與了我們的整個流程。
1,引擎:它參與了整個JS程式的編譯和執行。
2,編譯器:它負責了語法分析和程式碼的產生。
3,作用域:它負責手機並維護所有的標識符也就(變數)組成的一系列查詢,並對此實施了一套十分嚴格的規則,確定目前執行的程式碼對這些標識符的存取權限。
當引擎看到var a =1;的時候它和我們所想的是不一樣的,我們想這是一個聲明,他所認為的其實是這裡有倆完全不同的聲明,一個由編譯器在編譯的時候處理,另一個則由引擎在執行時間處理。那我們來看看他們到底是怎麼工作的。
編譯器會先講var a = 1;這段程式分解成詞法單元,然後將詞法單元解析成一個樹狀結構,但是當編譯器開始進行程式碼產生的時候,他對這段程序的處理方式會有所不同。
在我們理解的範圍內,編譯器是這樣工作的:為一個變數分配內存,將其命名為a,然後講值1保存進這個變量,但事實是不同的。
1,遇到 var a 的時候,編譯器會先詢問作用域是否已經有一個該名稱的變數存在於同一個作用域的集合中。如果是,編譯器就會忽略該宣告並繼續進行編譯,不然的話他會要求作用域在目前作用域的集合中宣告一個變數命名為a。
2,然後編譯器開始為引擎產生執行所需的程式碼,這些程式碼會被用來處理 a = 1 這個賦值的運算。然後引擎運行,它會先詢問作用域,當前作用域集合中是否存在了一個叫a的變量,如果是引擎就會使用這個變量,如果否,引擎會繼續在當前作用域的上級作用域查找該變數。最後只要找到了a,引擎就會把1賦值給它,如果沒有找到,引擎就會拋出一個異常。
所以說:在新變數的賦值中存在兩個操作,第一個是編譯器宣告變量,第二個是引擎在作用域中尋找該變量,並對其賦值。
下面看一段簡單的程式碼
function demo(a){ console.log(a) } demo(2);
在繼續說之前,我們先看看LHS和RHS,顧名思義,一個左一個右。這是引擎對變數所用的兩個查詢,L和R代表的是一個賦值的左側和右側(大部分情況下),也就是說當變數出現在賦值的左側時進行LHS查詢,出現在右側時進行RHS查詢。但更確切的說法其實是RHS查詢只是簡單的找出某個變數的值,而LHS查詢則是找到變數的容器本身,以便對其進行賦值操作。那麼根據這個說法,我們可以發現RHS其實代表的應該是「非左側」。我們來看一個簡單程式碼。
var a = 1; console.log(a);
在上面的代码中,var a =1;对a的引用是一个LHS引用,而console.log(a)的a其实就是一个RHS引用。再看一个例子:
function demo(a){ console.log(a); } demo(1);
上面的代码中其实包含了RHS和LHS引用。我们理解下demo(1);的意思,它其实意味着RHS引用demo这个值,(...)意味着它需要被执行,而在执行的过程中,有一个隐式的LRS引用 a = 1; 这个查询发生在参数传递的过程中。其中的console.log(a)也是个RHS引用。
同时我们需要知道,不成功的RHS会导致抛出一个异常,而不成功的LHS引用会导致自动隐式的创建一个全局变量(非严格模式),或者抛出异常(严格模式)。
作用域的嵌套
当一个块或者函数嵌套在另一个块或者函数内时,就发生了作用域的嵌套。因此,当在当前作用域中无法找到该变量时,引擎就会在外层嵌套的作用域中继续查找(若一直没有找到会到达全局作用域),直到找到该变量。
上图一层一层往外形成的结构就是我们常说的作用域链,最内层代表当前执行环境的作用域,最外层代表全局作用域。LHS和RHS都会在当前作用域进行查找,如果没有找到,就会向外,以此类推,如果到达全局作用域都没有找到,那无论如何这个查找过程都会停止。
以上是解析Javascript的作用域與賦值操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。