国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

閉包是如何產(chǎn)生的?你知道嗎?

開發(fā) 前端
調(diào)用函數(shù)時,會產(chǎn)生調(diào)用棧,將當(dāng)前函數(shù)上下文入棧,會保存基本類型變量。引用變量會在堆內(nèi)存中創(chuàng)建,然后在棧內(nèi)存中引用過來。

大家好,我是前端西瓜哥。

這次從內(nèi)存管理的角度來看看,閉包是怎么產(chǎn)生的。

我們知道,在調(diào)用函數(shù)時,其實會產(chǎn)生臨時的 調(diào)用棧。這些調(diào)用棧保存的是 執(zhí)行上下本,并實際保存在 棧內(nèi)存 中。

每執(zhí)行一個函數(shù),函數(shù)內(nèi)的局部臨時變量會臨時保存起來。如果此時函數(shù)又調(diào)用了另一個函數(shù),另一個函數(shù)下的局部變量也要保存下來,就這樣,我們產(chǎn)生了棧。

當(dāng)一個函數(shù)執(zhí)行完后,它對應(yīng)的局部臨時變量就會被銷毀。

局部變量保存下來,是為了保護上下文現(xiàn)場。

舉例說明一下:

function a() {
const a_num = 99;
const a_obj = { val: "a" };
b();
}

function b() {
const b_str = "text";
c();
}

function c() {
const c_bool = true;
// debugger
}

a();

這里我們嵌套調(diào)用了 a、b、c 函數(shù),會產(chǎn)生如下的調(diào)用棧。

圖片

基本類型的臨時變量,會直接保存到棧內(nèi)存中,對于引用類型,則是在堆內(nèi)存中生成,然后將地址拿到,保存到棧內(nèi)存中。

引用類型為什么不直接放到棧內(nèi)存中?因為棧內(nèi)存不是很大,很容易就棧溢出,而引用類型通常很大。

閉包的產(chǎn)生

函數(shù)調(diào)用完成后,它內(nèi)部聲明的臨時變量會被銷毀。理論上應(yīng)該如此,但如果使用了閉包,可以會讓臨時變量一直保留不被銷毀。

例子:

function createCounter() {
let count = 0;
let otherVal = "other val";
return function counter() {
// debugger;
console.log(count++);
};
}

const counter = createCounter();

console.log(counter());

執(zhí)行過程為:

  1. 執(zhí)行函數(shù) createCounter 時,會創(chuàng)建一個空的上下文對象。
  2. 遇到內(nèi)部函數(shù) counter,會預(yù)掃描內(nèi)部函數(shù) counter 使用了 createCounter 下的哪些便利,最終掃描出 count 變量。于是在堆內(nèi)存創(chuàng)建一個閉包 Closure (createCounter) 對象,將 count 加進去。otherVal 不會加到閉包對象上,因為它沒有被使用。
  3. 這個內(nèi)部函數(shù)最后被返回,被引用,閉包就一直不會銷毀。

使用 DevTool 可以觀察到這個閉包對象:

圖片

所以,如果一個閉包返回的函數(shù)執(zhí)行完后不用了,要設(shè)置為 null。否則它關(guān)聯(lián)的閉包對象會一直在那里占用內(nèi)存。

多個內(nèi)部函數(shù)共享一個閉包對象

另外,如果有多個內(nèi)部函數(shù),這些函數(shù)會共用同一個閉包對象。即使其中的一個內(nèi)部函數(shù)不會返回,它也會給閉包對象加?xùn)|西。

下面我們加了一個 printOtherVal 的內(nèi)部函數(shù),它并不返回,但還是會導(dǎo)致返回 counter 函數(shù)對應(yīng)的閉包對象帶上了它不需要的 otherVal 變量。

圖片

這是 JS 引擎處理閉包策略問題,理論不應(yīng)該有這樣奇怪的效果。

結(jié)尾

調(diào)用函數(shù)時,會產(chǎn)生調(diào)用棧,將當(dāng)前函數(shù)上下文入棧,會保存基本類型變量。引用變量會在堆內(nèi)存中創(chuàng)建,然后在棧內(nèi)存中引用過來。

因為 JavaScript 中函數(shù)是第一公民,所以會有閉包的概念。當(dāng)發(fā)現(xiàn)內(nèi)部函數(shù),會創(chuàng)建一個閉包對象,將其中使用到的外部函數(shù)變量保存到該閉包對象下。之后內(nèi)部函數(shù)被調(diào)用時,就會從閉包里提取變量,如果找不到則從全局上下文提取。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2024-11-26 00:45:29

free區(qū)域字段

2024-06-20 08:06:30

2025-01-16 16:41:00

ObjectConditionJDK

2024-10-05 00:00:00

HTTPS性能HTTP/2

2024-10-24 08:47:12

2023-12-20 08:23:53

NIO組件非阻塞

2023-05-30 08:19:07

kafka集群leader

2024-12-04 08:40:19

2022-11-28 00:04:17

2024-01-15 12:16:37

2024-02-19 00:00:00

Docker輕量級容器

2024-07-30 08:22:47

API前端網(wǎng)關(guān)

2024-11-08 09:48:38

異步編程I/O密集

2024-07-08 00:00:01

多線程ThreadC#

2023-03-21 07:39:51

CentOS掛載硬盤

2023-01-13 17:02:10

操作系統(tǒng)鴻蒙

2024-03-19 08:01:54

服務(wù)熔斷軟件設(shè)計模式微服務(wù)

2024-02-19 07:44:52

虛擬機Java平臺

2022-11-23 10:33:42

2023-02-28 07:39:18

點贊
收藏

51CTO技術(shù)棧公眾號

日韩激情视频在线观看| 五月婷婷综合在线| 亚洲成av人片一区二区| 一区二区三区四区电影| 一区二区三区高清在线| 国产对白在线播放| 欧美a大片欧美片| 爽爽淫人综合网网站| 国语自产精品视频在线看一大j8 | 国产成人精品视| 日韩精品极品| 日本免费在线视频不卡一不卡二| 91精品国产亚洲| 激情亚洲色图| 国产高清无密码一区二区三区| 国产视频观看一区| 日韩一区二区三区精品视频第3页| 日韩欧美中文字幕制服| 欧美日韩在线一区二区三区| 日本动漫同人动漫在线观看| 亚洲欧美电影一区二区| 99福利在线观看| 久久国内精品视频| 欧美日本韩国国产| 日韩av有码| 欧美日韩你懂得| 男男视频在线观看网站| 97久久精品人人澡人人爽| 日本一区二区免费高清视频| 日韩电影一二三区| 色姑娘综合av| 无遮挡在线观看| 91精品国产色综合久久| 一级毛片视频在线观看| 另类成人小视频在线| 美女精品国产| 夜夜嗨av一区二区三区网站四季av| 91精品视频免费| 欧美午夜不卡影院在线观看完整版免费| 国产精品色婷婷视频| 黄色精品在线观看| 不卡在线观看av| 久久男人资源站| 成+人+亚洲+综合天堂| av免费观看国产| 91亚洲精品乱码久久久久久蜜桃| 日韩一区二区免费高清| av电影在线观看一区二区三区| 黑人狂躁日本妞一区二区三区| 99热在线网站| 日韩国产在线观看| 欧美日韩另类丝袜其他| 香蕉av777xxx色综合一区| 精品午夜一区二区| 热久久免费视频| www.在线观看av| 久久久久久日产精品| 51成人做爰www免费看网站| 91精品国产视频| 国产在线精品日韩| 国产一区二区av在线| 欧美日本国产在线| 欧美日韩一区二区三区在线电影| 日产日韩在线亚洲欧美| 超碰在线网址| 亚洲国产精品字幕| 9999在线精品视频| 日韩美女免费视频| 牛牛国产精品| 美国av一区二区三区| 国产综合久久久久久鬼色| 欧美 丝袜 自拍 制服 另类| 亚洲欧美日本韩国| 在线免费av电影| 影音先锋欧美精品| 亚乱亚乱亚洲乱妇| 亚洲精品国产成人| 中文字幕日韩高清在线| 国产欧美久久久久久| 日日嗨av一区二区三区四区| 国产日韩一区二区在线| 五月激情丁香一区二区三区| 国产高清自产拍av在线| 久久久久久久久亚洲| 在线看福利影| 精品久久久久久久久久| 午夜dj在线观看高清视频完整版| 一区二区三区久久精品| 超碰成人久久| 久久久精品视频成人| 免费精品国产| 欧美国产视频一区二区| 天天天综合网| 99热都是精品| 亚洲永久免费精品| 无码人妻丰满熟妇区毛片18| 日韩欧美国产高清91| 热久久精品免费视频| 欧美午夜影院一区| 国产精品va视频| 国产精品乱子乱xxxx| 久久精品一区二区三区四区| av在线收看| 91av在线影院| 国产精品99久久久久久久vr| 你懂的在线视频| 午夜精品久久一牛影视| 国产在线拍揄自揄拍视频| 色婷婷国产精品| 国产剧情演绎av| 欧美成人r级一区二区三区| 天堂√在线中文官网在线| 中文字幕一区日韩精品欧美| 黄色网页在线观看| 国产成人精品999| 成人精品免费网站| 国产黄色在线| 日本免费在线精品| 国产成人综合网| 成人看片免费| 国产精品igao视频| 国产亚洲精品超碰| 亚洲天堂av在线| 国产一区二区三区黄| 亚洲成av人在线观看| www.久久东京| 免费欧美一级视频| 亚洲人免费视频| **欧美日韩在线观看| 国产伦精品一区二区三区视频黑人 | 青青在线免费视频| 在线观看日产精品| 精品freesex老太交| 九九视频精品在线观看| 91年精品国产| 97人人在线视频| 欧美高清视频一区| 欧美日韩在线直播| 欧美高清不卡| 精品av中文字幕在线毛片| 国产精品亚发布| 亚洲五码中文字幕| av在线电影观看| 国产不卡视频在线| 中文字幕一区二区三区视频| 久久av网站| 国产精品久久久久久搜索 | 日韩视频中文字幕| 国产成人精品午夜视频免费| 爱福利视频一区二区| 亚洲美女黄色片| 亚洲一区二区三区日本久久九| 少妇高潮大叫好爽喷水| 日韩电视剧在线观看免费网站| 日本三级亚洲精品| 电影在线观看一区| 成年人黄色在线观看| 亚洲欧美中文日韩v在线观看| 精东粉嫩av免费一区二区三区| 精品视频无码一区二区三区| 亚洲美女在线一区| 欧美18xxxx| 亚欧精品一区| 成人激情春色网| 精品影视av免费| 天堂中文av在线资源库| 激情图片qvod| 久久五月天综合| 国产精品久久久久久久裸模| 国产精品一在线观看| 免费久久99精品国产自| 日韩一区二区三区高清免费看看| 久久午夜av| 深夜av在线| 131美女爱做视频| 性欧美办公室18xxxxhd| 亚洲综合激情| bl在线肉h视频大尺度| 熟女熟妇伦久久影院毛片一区二区| 亚洲欧美一区二区激情| 99久久久久久| 国产麻豆精品久久| www 日韩| 日韩精品一区二区在线视频| 97免费在线视频| 在线一区二区三区| 免费成人av资源网| 亚洲人体在线| 成人频在线观看| 欧洲国产精品| 成人欧美一区二区三区黑人麻豆| 日本www在线观看| 91大神在线播放精品| 亚洲综合自拍偷拍| 在线亚洲自拍| 日韩专区视频| 欧美美乳在线| av在线免费观看国产| 国产精品美女无圣光视频| 91精品国产综合久久精品|