摘要:前言這篇文章不是全面講閉包知識的,而是針對那些已經(jīng)對閉包有所了解但是還存在疑惑的人群。那么為什么能保存在函數(shù)變量里面的呢實(shí)現(xiàn)閉包閉包函數(shù)定義時(shí)的作用域鏈到函數(shù)執(zhí)行時(shí)仍然有效。
前言
這篇文章不是全面講閉包知識的,而是針對那些已經(jīng)對閉包有所了解但是還存在疑惑的人群。比如:閉包為何能保存變量?接下來就詳細(xì)講述此類問題。以下內(nèi)容來自犀牛書第六版。
正文 經(jīng)典閉包案例函數(shù)柯里化:
function curry(fn){ var arg1 = Array.prototype.slice.call(arguments,1); return function(){ var arg2 = Array.prototype.slice.call(arguments); var mergeArr = arg1.concat(arg2); return fn.apply(null,mergeArr); } } function add(num1,num2){ return num1 + num2; } var curriedAdd = curry(add, 5); alert(curriedAdd(3)); // 8疑惑
外部函數(shù)中定義的局部變量在函數(shù)返回之后就不存在了,那么嵌套的函數(shù)是如何調(diào)用不存在的作用域鏈的呢?如上面所示,調(diào)用curriedAdd()的時(shí)候,第一次傳入的5是存在的。那么5為什么能保存在函數(shù)變量里面的呢?
實(shí)現(xiàn)閉包閉包:函數(shù)定義時(shí)的作用域鏈到函數(shù)執(zhí)行時(shí)仍然有效。
我們將函數(shù)作用域描述為一個(gè)對象列表,不是綁定的棧。每次調(diào)用javascript函數(shù)的時(shí)候,都會(huì)為之創(chuàng)建一個(gè)新的局部變量對象來保存局部變量,把這個(gè)對象添加至作用域鏈中。當(dāng)函數(shù)返回的時(shí)候,就從作用域鏈中將這個(gè)綁定變量的對象刪除。
1.如果不存在嵌套的函數(shù),也沒有其他引用指向這個(gè)綁定的對象,它就會(huì)被當(dāng)做垃圾回收掉。
2.如果定義了嵌套的函數(shù),每個(gè)嵌套的函數(shù)都各自對應(yīng)一個(gè)作用域鏈,并且這個(gè)作用域鏈指向一個(gè)變量綁定對象。
(1)如果這些嵌套函數(shù)對象在外部函數(shù)中保存了下來(比如賦值給外部函數(shù)中的某個(gè)變量),它們也會(huì)和所指向的變量綁定對象一樣當(dāng)做垃圾回收
(2)但是如果這個(gè)函數(shù)定義了嵌套函數(shù),并將它們作為返回值返回,或者存儲(chǔ)在某處的屬性里,這時(shí)就會(huì)有一個(gè)外部引用指向這個(gè)嵌套函數(shù),它就不會(huì)被當(dāng)做垃圾回收。并且它所指向的變量綁定對象也不會(huì)被當(dāng)作垃圾回收。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86907.html
摘要:詞法作用域的查找規(guī)則是閉包的一部分。因此的確同閉包息息相關(guān),即使本身并不會(huì)真的使用閉包。而上面的創(chuàng)建一個(gè)閉包,本質(zhì)上這是將一個(gè)塊轉(zhuǎn)換成一個(gè)可以被關(guān)閉的作用域。結(jié)合塊級作用域與閉包模塊這個(gè)模式在中被稱為模塊。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗(yàn)豐富的 Jav...
摘要:吐槽一下,閉包這個(gè)詞的翻譯真是有很大的誤解性啊要說閉包,要先說下詞法作用域。閉包兩個(gè)作用通過閉包,在外部環(huán)境訪問內(nèi)部環(huán)境的變量。閉包使得函數(shù)可以繼續(xù)訪問定義時(shí)的詞法作用域。 閉包是真的讓人頭暈啊,看了很久還是覺得很模糊。只能把目前自己的一些理解先寫下來,這其中必定包含著一些錯(cuò)誤,待日后有更深刻的理解時(shí)再作更改。 吐槽一下,閉包這個(gè)詞的翻譯真是有很大的誤解性啊…… 要說閉包,要先說下詞法...
摘要:回憶我一年前,雖然使用過很多,但卻完全不理解閉包是什么。就算你,也會(huì)在循環(huán)完成時(shí),輸出次當(dāng)然,不要以為主要的原因是延遲函數(shù)會(huì)在循環(huán)結(jié)束時(shí)才執(zhí)行,不然我為什么會(huì)在閉包這一節(jié)用使用這個(gè)例子,哈哈。 前言 在了解閉包的概念時(shí),我希望你能夠有JavaScript詞法作用域的知識,因?yàn)樗鼤?huì)讓你更容易讀懂這篇文章。 感觸 對于那些使用過JavaScript但卻完全不理解閉包概念的人來說,理解閉包可...
摘要:注此讀書筆記只記錄本人原先不太理解的內(nèi)容經(jīng)過閱讀你不知道的后的理解。作用域及閉包基礎(chǔ),代碼運(yùn)行的幕后工作者引擎及編譯器。 注:此讀書筆記只記錄本人原先不太理解的內(nèi)容經(jīng)過閱讀《你不知道的JS》后的理解。 作用域及閉包基礎(chǔ),JS代碼運(yùn)行的幕后工作者:引擎及編譯器。引擎負(fù)責(zé)JS程序的編譯及執(zhí)行,編譯器負(fù)責(zé)詞法分析和代碼生成。那么作用域就像一個(gè)容器,引擎及編譯器都從這里提取東西。 ...
摘要:建筑的頂層代表全局作用域。實(shí)際的塊級作用域遠(yuǎn)不止如此塊級作用域函數(shù)作用域早期盛行的立即執(zhí)行函數(shù)就是為了形成塊級作用域,不污染全局。這便是閉包的特點(diǎn)吧經(jīng)典面試題下面的代碼輸出內(nèi)容答案個(gè)如何處理能夠輸出閉包方式方式下一篇你不知道的筆記 下一篇:《你不知道的javascript》筆記_this 寫在前面 這一系列的筆記是在《javascript高級程序設(shè)計(jì)》讀書筆記系列的升華版本,旨在將零碎...
閱讀 1554·2023-04-25 18:56
閱讀 1499·2021-09-29 09:34
閱讀 1717·2021-09-22 15:51
閱讀 3520·2021-09-14 18:03
閱讀 1173·2021-07-23 17:54
閱讀 2031·2019-08-29 18:38
閱讀 2911·2019-08-29 12:38
閱讀 620·2019-08-26 13:41