内部函数总是可以访问其所在的外部函数中声明的参数和变数,即使外部函式已经结束执行了。
看看这个例子:
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执行环境已经离开执行堆。
如图:
执行环境可以把它的外部变数关住、包住,以确保函数可以取用外部变数的现象 称为闭包。
参考资料:
MDN 闭包
闭包,看这一篇就够了——带你看透闭包的本质,百发百中
阮一峰的网路日志 学习Javascript闭包(Closure)
>>: Day23 - 使用Django-allauth整合社群登入
当想不到今天要做什麽时就来解 LeetCode。 You are a professional ro...
知识产权具有所有者,否则它将属於公共领域。“商业秘密是指可以出售或许可的机密信息的知识产权(IP)。...
贺喜 撑过连假大魔王的第二波攻势 我存活下来了~~~ 好的今天要来分享的地图呈现方式是heat ma...
今天要来介绍後端,所谓的後端简单来说就是负责资料的部分,因为有关於资料都会是他们处理,而要让资料显示...
【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...