JavaScript 闭包(Closure) 上集

闭包

内部函数总是可以访问其所在的外部函数中声明的参数和变数,即使外部函式已经结束执行了。

看看这个例子:
EX:

function greet(what){
return function(name){

console.log(what+" "+name);}
}

var aa=greet('Hi');
aa('Ivy');
// Hi Ivy

外面的greet函式已经被呼叫并执行完毕了,为甚麽里面回传的函数还知道greet传进来的'Hi'?彷佛外面的函数以及变数what还在一样。

因为当greet函数被呼叫,新的执行环境被创造而且what参数被传入,存进greet函数的变数中。
然後很快地创造一个物件函数,回传之後greet的执行环境马上离开执行堆。

但问题来了,每个执行环境都有他的记忆体空间,一般来说,当执行环境没了之後记忆体空间会被JavaScript引擎回收。
但是在这里,记忆体空间还在。
而下面呼叫aa,另一个新的执行环境被创造,在这个函数里面想要找 what 变数找不到,就往更外一层找,就算greet的执行环境没有了,aa 还是可以参考到 greet函数的变数,在aa外部环境的记忆体空间,即使greet执行环境已经离开执行堆。
如图:
https://ithelp.ithome.com.tw/upload/images/20211005/20135414sFfKGYuuzz.jpg

执行环境可以把它的外部变数关住、包住,以确保函数可以取用外部变数的现象 称为闭包。

参考资料:
MDN 闭包
闭包,看这一篇就够了——带你看透闭包的本质,百发百中
阮一峰的网路日志 学习Javascript闭包(Closure)


<<:  【Day 20】Go 基础语法

>>:  Day23 - 使用Django-allauth整合社群登入

Day 21 LeetCode 198. House Robber

当想不到今天要做什麽时就来解 LeetCode。 You are a professional ro...

智慧财产的角度-保护生产参数应该思考的最关键问题

知识产权具有所有者,否则它将属於公共领域。“商业秘密是指可以出售或许可的机密信息的知识产权(IP)。...

Day[-4] 今天我想来点Kibana的Map Chart -4

贺喜 撑过连假大魔王的第二波攻势 我存活下来了~~~ 好的今天要来分享的地图呈现方式是heat ma...

全端入门Day05_何谓全端之後端首篇

今天要来介绍後端,所谓的後端简单来说就是负责资料的部分,因为有关於资料都会是他们处理,而要让资料显示...

【JavaScript】阵列与常用的四种新增删除方法

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...