delphi 函數內創建對象 釋放_JavaScript 的函數底層運行機制

▲ 點擊上方藍字關注我?▲文?/?景朝霞來源公號 /?朝霞的光影筆記ID /?zhaoxiajingjing圖?/?自己畫

目錄0 / 題(1)第一題(2)第二題1 / 引用數據類型:object2 / 引用數據類型:function(1)第二題,簡圖(2)創建函數(3)執行函數(4)閉包3 / 練習題(1)第一題(2)第二題(3)第三題

0 / 題

(1)第一題
 var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b);

△ 引用數據類型:object

(2)第二題
 var x = [12, 23]; function fn(y) {     y[0] = 100;     y = [100];     y[1] = 200;     console.log(y); } fn(x); console.log(x);

△ 引用數據類型:function

這些題是不是很簡單?我們主要看邏輯:

1 / 引用數據類型:object

在Web瀏覽器中執行JS代碼,會開辟一塊棧內存來作為執行環境:ECStack(Execution Context Stack)

會開辟一塊棧內存供全局代碼執行:全局執行上下文 EC(G)(Execution Context Global),還有其他的上下文:函數私有執行上下文、塊級私有上下文…… 自己管好自己那一攤的代碼執行內容

形成的執行上下文都會 進棧 到執行環境棧中運行.私有上下文會在不被占用時出棧釋放,瀏覽器的回收機制GC.當瀏覽器關閉時,全局執行上下文就會出棧釋放了

△ 圖2.1_第一題,簡圖

GO:全局對象 Global Object ,并不是VO(G)全局變量對象 Variable Object Global

全局對象,它是個對象,它就是個堆內存,瀏覽器打開一加載頁面就默認開辟的堆內存。

瀏覽器提供的一些供JS調用的API,在Web瀏覽器中,全局對象可以通過window來訪問的

?注意:運算符優先級,要多看看多比劃比劃

注意基本數據類型值直接存儲在棧內存中,引用數據類型值存在堆內存

2 / 引用數據類型:function

 var x = [12, 23]; function fn(y) {     y[0] = 100;     y = [100];     y[1] = 200;     console.log(y); } fn(x); console.log(x);

△ 函數執行

(1)第二題,簡圖

△ 圖2.2_函數執行

△ 圖2.3_數組的格式:鍵值對

(2)創建函數

創建函數的步驟:【和創建變量區別不是很大,函數名就是變量名】

① 單獨開辟一個堆內存:16進制地址,函數堆內存中存儲的是函數體中的代碼字符串

② 創建函數的時候,就聲明了它的作用域[[scope]],也就是所在的上下文環境

③ 把16進制地址(16進制以0x開頭)存放到棧中,供函數名變量名關聯引用即可

只創建函數,不執行函數,沒啥意義,那就是一堆字符串。

函數執行的目的:把創建函數的時候在堆內存中存儲的 代碼字符串 變為代碼執行

代碼執行一定會有一個執行的環境,它的上級執行上下文,是函數創建的地方

函數執行會形成一個全新的、私有的執行上下文,在私有上下文中,也有存放自己變量的對象:AO(Active Object 活動對象),它是VO的一種。

變量對象: ① 在全局上下文中:VO ?② 在私有上下文中:AO

實參都是值。形參是變量。

fn(x):執行函數fn,把全局上下文中存儲的x變量關聯的值(0x000001),作為實參傳遞給函數的形參變量

(3)執行函數

執行函數做了哪些事情:

1、形成了一個全新的、私有的執行上下文EC(xxx)

2、當前私有的上下文中,有一個存放此上下文內聲明的變量的地方 AO(xxx) 私有變量對象

① 形參變量

② 當前上下文中聲明的變量

3、進棧執行

4、代碼執行之前還要處理很多事情:

① 初始化作用域鏈

[[scope-chain]]:

(作用域鏈有兩頭,一頭是自己執行的上下文,另一頭是自己創建時所在的上下文)

即:當前函數的上級上下文是創建函數所在的上下文,就是作用域

以后再遇到函數內的代碼執行,遇到一個變量,首先看是否為自己上下文中的私有變量(看AO中有沒有,有,是自己私有的;沒有,不是自己私有的)。如果是私有的變量,則當前變量的操作和外界環境中的變量互不干擾(沒有直接關系);如果不是自己的私有變量,則按照作用域鏈,查找是否為其上級上下文中的私有變量.....一直找到EC(G)全局上下文為止:作用域鏈查找機制

② 初始化this....

③ 初始化arguments....

④ 形參賦值:形參都是私有變量,放在AO中的。如果不傳遞實參,默認值是undefined

⑤ 變量提升....

5、代碼自上而下執行

6、.....

7、一般情況下,函數執行所形成的私有上下文,進棧執行完后,會默認出棧釋放掉

【私有上下文中存儲的私有變量和一些值都會被釋放掉,目的:為了優化內存空間,減少棧內存的消耗,提高頁面或者計算機的處理速度......】

不能出棧釋放:當前上下文中某些內容(一般是堆內存地址)被當前上下文的外部的事物占用了,則無法出棧釋放。一旦被釋放,后期外部事物就無法找到對應的內容了

注意:多次函數執行,會形成多個全新的、私有執行上下文,這些上下文之間沒有直接的關系

(4)閉包

一般,很多人認為:大函數返回小函數是閉包。

這只是閉包機制中的一種情況。

閉包:函數執行形成一個私有的執行上下文,此上下文中的私有變量,與此上下文以外的變量互不干擾;也就是當前上下文把這些變量保護起來了,我們把函數的這種保護機制稱為閉包。

閉包不是具體的代碼,而是一種機制。

一般情況下,形成的私有上下文很容易被釋放掉,這種保護機制存在時間太短了,不是嚴謹意義上的閉包。有人認為,形成的上下文不被釋放,才是閉包。此時,不僅保護了私有變量,而且這些變量和存儲的值也不會被釋放掉,保存起來了。

閉包的作用:① 保護 ② 保存

利用閉包的兩個作用,可以實現高階編程技巧,以后再說~

3 / 練習題

(1)第一題
 var x = 100; function fn() {     var x = 200;     return function(y) {         console.log(y + x++);    } } var f = fn(); f(10); f(20);

△ 第一題

i++ 后加

△ 圖2.4_后加

(2)第二題
 let a=0,     b=0; function A(a){     A=function(b){         alert(a+b++);    };     alert(a++); } A(1); A(2);

△ 第二題

(3)第三題
 let x = 5; function fn(x) {     return function(y) {         console.log(y + (++x));    } } let f = fn(6); f(7); fn(8)(9); f(10); console.log(x);

△ 第三題

- end -

從“”到“更好的你

有無限可能

好啦,好啦,碎碎念了很多:

全局執行上下文、創建函數、作用域、執行函數、私有執行上下文、AO和VO、實參、形參、作用域鏈

△ 圖2.5_練習題,第一題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity3D學習筆記之五為Prefab添加材質

本次筆記中,我們將利用unity來創建并使用材質,把材質添加到我們的Prefab中去。這一系列教程以及素材均參考自人人素材翻譯組出品的翻譯教程《Unity游戲引擎的基礎入門視頻教程》,下載鏈接附在第二篇學習筆記中。繼續上次筆記中所記錄的東西&a…

分布式版本控制系統之Git

Git Git 是目前世界上最先進的分布式版本控制系統(沒有之一)作用 源代碼管理為什么要進行源代碼管理? 方便多人協同開發方便版本控制Git的誕生 作者是 Linux 之父:Linus Benedict Torvalds當初開發 Git 僅僅是為了輔助 Linux 內核的開發&…

oo第三次博客-JML規格

這三周的作業主要是圍繞以JML來約束代碼開發,以確保程序的正確性與魯棒性。 Part 1:三次作業的實現與bug 第一次作業沒有任何算法和數據結構上的難度,對于Path和PathContainer的各個方法的實現按照給出的規格復讀即可。唯一的難點&#xff08…

Kinect開發筆記之一Kinect詳細介紹

畢業設計的課題我選擇了結合Kinect和Unity3D開發體感游戲,這是我十分感興趣的一個課題,所以做好當然責無旁貸。準備再寫一系列Kinect的學習筆記,記錄自己畢設一步一個腳印的歷程。1、Kinect背景介紹眾所周知,Kinect是一款集成了很…

獲取2個地址之間的距離(高德API)

2019獨角獸企業重金招聘Python工程師標準>>> string startLonLat SiteHelper.GetLonLat("大連"); //獲取起始地經度緯度 string endLonLat SiteHelper.GetLonLat("沈陽"); //獲取目的地經度緯度 int distance SiteHelper.GetDistance(star…

WPF屬性學習

一.WPF屬性系統 CLR屬性 .NET中的屬性稱為CLR屬性 轉載于:https://www.cnblogs.com/programme-maker/p/10910166.html

chemdraw怎么連接兩個結構_利用神經結構搜索構建快速準確輕量級的超分辨率網絡...

介紹我們知道,把神經網絡拆解,可以把它歸結為幾個元素的排列組合而成,例如,以卷積神經網絡為例,其主要由卷積層,池化層,殘差連接,注意力層,全連接層等組成,如…

Unity3D學習筆記之六創建更多的Prefab

在寫完第五篇后,因為不知名的原因,我突然不能夠上傳100KB以上的圖片在博客中了。等了幾天還是這樣,所以我用PS把圖片的分辨率一張張調低,讓圖片的大小都在100左右,將積攢了四篇的學習筆記一起發上來,也算彌…

iOS底層探索(二) - 寫給小白看的Clang編譯過程原理

iOS底層探索(一) - 從零開始認識Clang與LLVM 寫在前面 編譯器是屬于底層知識,在日常開發中少有涉及,但在我的印象中,越接近底層是越需要編程基本功,也是越復雜的。但要想提升技術卻始終繞不開要對底層原理的探究,很多資…

四、構建Node Web程序

---恢復內容開始--- 一、HTTP 服務器的基礎知識 1、Node如何向開發者呈現HTTP請求 2、一個用“Hello World”做響應的HTTP服務器 它用了默 認的狀態碼200(表明成功)和默認的響應頭 3、讀取請求頭及設定響應頭 Node提供了幾個修改HTTP響應頭的方法&#x…

datagrid 什么時候結束編輯_2020年中考結束后,什么時候出分?什么時候報志愿?...

導語7月19日下午16:00,2020年北京中考正式落下帷幕。考試結束后,很多家長和考生都會長舒一口氣,但北京中考在線團隊提醒你,現在還不是放松的時刻,中考結束后,還有成績查詢和填報志愿等重要事件等著你。那么…

Unity3D學習筆記之七創建自己的游戲場景

到現在為止我們已經擁有了比較完備的Prefab,已經可以創建宏大的游戲場景,并以第一人稱視角在場景中漫游了。這里給大家做個小的示范,建一個小場景大家在創建場景的時候需要自由發揮,做個盡量大的場景出來。這一系列教程以及素材均…

excel if in函數_【Excel函數】Small+Index+IF 一對N返回

通常情況下,Vlookup和lookup函數只能返回滿足條件的第一個,剩余的都不會返回。 這也是其函數的一個弊端之一。 若是按照條件,返回所有滿足條件的數據(1->N)的,可是適用組合函數。 Index返回位置&#xf…

Unity3D學習筆記之八為場景添加細節(一)

這一系列教程以及素材均參考自人人素材翻譯組出品的翻譯教程《Unity游戲引擎的基礎入門視頻教程》,下載鏈接附在第二篇學習筆記中。我花了30分鐘做了一個中等大小的迷宮場景,不知道大家自己發揮,做的場景大小如何。在完成場景之后&#xff0c…

mysql數據庫表的管理(增刪改)

表字段管理1. 添加到末尾alter table 表名 add 字段名 數據類型;2 添加到開頭alter table 表名 add 數據類型 first;3. 添加到指定位置alter table 表名 add 新字段名 數據類型 after 原有字段名;4. 刪除字段alter table 表名 drop 字段名;5. 修改數據類型alter ta…

哪個app最費電_微波爐和烤箱,買哪個劃算?

微波爐和烤箱不能說買哪個劃算,而是看哪個更適合?我家微波爐和烤箱兩個都有,所以這個問題我來回答一下。雖然外形上看起來,微波爐和烤箱似乎沒有多大的區別,從功能上看,它們也都是加熱,但它們側…

MATLAB數值計算與符號運算

符號計算 存放的是精確數據,耗存儲空間 ,運行速度慢,但結果精度高; 數值計算則是以一定精度來計算的,計算結果有誤差,但是運行速度快。轉載于:https://www.cnblogs.com/shawnchou/p/10927680.html

Unity3D學習筆記之九為場景添加細節(二)

上節為場景中添加了第一塊帶有碰撞器的石頭,本節我們來利用Prefab,將場景細節都添加進去,并且做的更完善。這一系列教程以及素材均參考自人人素材翻譯組出品的翻譯教程《Unity游戲引擎的基礎入門視頻教程》,下載鏈接附在第二篇學習…

vux Cell組件

Cell 組件一 <style lang"scss">.cell {padding-top: 15px;padding-bottom: 15px;color: #333;img {display: block;margin-right: 15px;}} </style><template><Group><cell class"cell" title"錢包" :border-intent…

wifi名稱可以有空格嗎_收購公司后可以變更公司名稱嗎,變更公司名稱和股權如何處理?...

【點擊文末小程序&#xff0c;免費咨詢法律問題】公司收購是指二手設備收購&#xff0c;指向目標公司的二手設備&#xff0c;廢舊物資&#xff0c;進而獲取目標公司的全部或部分業務&#xff0c;取得對拆除的控制權。那么&#xff0c;收購公司后可以變更公司名稱嗎&#xff0c;…