開年之後工作熱情一直不是很高,這幾天一直處於消極怠工狀態。早上不想起床,起床了不想上班。明明放假前工作熱情還一直很高,一直心心念念的想把小程式項目懟出來,結果休假回來之後畫風完全不一樣了。我感覺自己得了嚴重了節後症候群。還好擼了幾篇文章,勉強表示這一週的時間沒有完全浪費。這篇文章要跟大家介紹的是變數物件。
在JavaScript中,我們肯定不可避免的需要宣告變數和函數,可是JS解析器是如何找到這些變數的呢?我們也得對執行上下文有進一步的了解。
在上一篇文章中,我們已經知道,當呼叫一個函數時(啟動),一個新的執行上下文就會被建立。而一個執行上下文的生命週期可以分成兩個階段。
1.創建階段
在這個階段中,執行上下文會分別創建變數對象,建立作用域鏈,以及確定this的指向
2.程式碼執行階段
創建完成之後,就會開始執行程式碼,這個時候,會完成變數賦值,函數引用,以及執行其他程式碼。
從這裡我們就可以看出詳細了解執行上下文極為重要,因為其中涉及到了變量對象,作用域鏈,this等很多人沒有怎麼弄明白,但是卻極為重要的概念,因此它關係到我們能不能真正理解JavaScript。在後面的文章中我們會一一詳細總結,這裡我們先專注於了解變數物件。
變數物件(Variable Object)
變數物件的創建,依序經歷了以下幾個過程。
1.建立arguments物件。檢查目前上下文中的參數,建立該物件下的屬性與屬性值。
2.檢查當前上下文的函數聲明,也就是使用function關鍵字聲明的函數。在變數物件中以函數名建立一個屬性,屬性值為指向函數所在記憶體位址的參考。如果函數名的屬性已經存在,那麼該屬性將會被新的參考所覆寫。
3.檢查當前上下文中的變數聲明,每找到一個變數聲明,就在變數物件中以變數名稱建立屬性,屬性值為undefined。如果該變數名的屬性已經存在,為了防止同名的函數被修改為undefined,則會直接跳過,原屬性值不會被修改。
根據這個規則,理解變數提升就變得十分簡單了。在很多文章中雖然提到了變數提升,但是具體是怎麼回事還真的很多人都說不出來,以後在面試中用變數對象的創建過程跟面試官解釋變數提升,保證瞬間提升逼格。
在上面的規則中我們看出,function聲明會比var聲明優先級更高一點。為了幫助大家更好的理解變數對象,我們結合一些簡單的例子來進行探討。
// demo01 function test() { console.log(a); console.log(foo()); var a = 1; function foo() { return 2; } } test();
在上例中,我們直接從test()的執行上下文開始理解。全域作用域中執行test()時,test()的執行上下文開始建立。為了便於理解,我們用如下的形式來表示
创建过程 testEC = { // 变量对象 VO: {}, scopeChain: {}, this: {} } // 因为本文暂时不详细解释作用域链和this,所以把变量对象专门提出来说明 // VO 为 Variable Object的缩写,即变量对象 VO = { arguments: {...}, foo: <foo reference> // 表示foo的地址引用 a: undefined }
未進入執行階段之前,變數物件中的屬性都不能存取!但是進入執行階段之後,變數物件轉變為了活動對象,裡面的屬性都能被存取了,然後開始進行執行階段的操作。
這樣,如果再面試的時候被問到變數對象和活動對像有什麼區別,就又可以自如的應答了,他們其實都是同一個對象,只是處於執行上下文的不同生命週期。
// 执行阶段 VO -> AO // Active Object AO = { arguments: {...}, foo: <foo reference>, a: 1 }
因此,上面的例子demo1,執行順序就變成了這樣
function test() { function foo() { return 2; } var a; console.log(a); console.log(foo()); a = 1; } test();
再來一個例子,鞏固一下我們的理解。
// demo2 function test() { console.log(foo); console.log(bar); var foo = 'Hello'; console.log(foo); var bar = function () { return 'world'; } function foo() { return 'hello'; } } test();
// 创建阶段 VO = { arguments: {...}, foo: <foo reference>, bar: undefined } // 这里有一个需要注意的地方,因为var声明的变量当遇到同名的属性时,会跳过而不会覆盖
// 执行阶段 VO -> AO VO = { arguments: {...}, foo: 'Hello', bar: <bar reference> }
需要結合上面的知識,仔細對比這個例子中變數物件從創建階段到執行階段的變化,如果你已經理解了,說明變數物件相關的東西都已經難不倒你了。
全域上下文的變數物件
以瀏覽器中為例,全域物件為window。
全域上下文有一個特殊的地方,它的變數對象,就是window對象。而這個特殊,在this指向上也同樣適用,this也是指向window。
// 以浏览器中为例,全局对象为window // 全局上下文 windowEC = { VO: window, scopeChain: {}, this: window }
除此之外,全域上下文的生命週期,與程式的生命週期一致,只要程式運作不結束,例如關掉瀏覽器窗口,全域上下文就會一直存在。其他所有的上下文環境,都能直接存取全域上下文的屬性。

JavaScript 不提供任何内存管理操作。相反,内存由 JavaScript VM 通过内存回收过程管理,该过程称为垃圾收集。

vscode自身是支持vue文件组件跳转到定义的,但是支持的力度是非常弱的。我们在vue-cli的配置的下,可以写很多灵活的用法,这样可以提升我们的生产效率。但是正是这些灵活的写法,导致了vscode自身提供的功能无法支持跳转到文件定义。为了兼容这些灵活的写法,提高工作效率,所以写了一个vscode支持vue文件跳转到定义的插件。

Node 19已正式发布,下面本篇文章就来带大家详解了解一下Node.js 19的 6 大特性,希望对大家有所帮助!

选择一个Node的Docker镜像看起来像是一件小事,但是镜像的大小和潜在漏洞可能会对你的CI/CD流程和安全造成重大的影响。那我们如何选择一个最好Node.js Docker镜像呢?

本篇文章给大家整理和分享几个前端文件处理相关的实用工具库,共分成6大类一一介绍给大家,希望对大家有所帮助。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中