Day-18 闭包

闭包(closure),即当使用高阶函式(function中有function、function回传function)时,可以将外层函式里宣告的变数&值「包进来」=>保留到内层函式使用。

范围链 Scope chain

闭包的本质,建立於范围链(Scope chain)的设计之上。其中一种范围链现象,就是前文『Day-12 函式与变数』 曾经提过的「函式变数未宣告,往外变全域」现象。完整
说明请另参考:
『[JavaScript] Javascript 的作用域 (Scope) 与范围链 (Scope Chain):往外找』

闭包范例

例:setTimeout与加法器

//  外层函式 = a
function a() {
    var x = 123
    
    //  closure 闭包
    //  内层函式 = setTimeout
    setTimeout(() => {
        console.log(x)
    }, 1000)
}
a()

x 本来会随着外层的泡泡破掉而消失,但 JS 却能把 x 一起带到 WebAPI 排队。

闭包过程

  1. 一开始 JS 会先建构全域执行环境、分配记忆体给函式及变数、建构函式及宣告变数&赋值。
  2. function a & setTimeout 、 var x = 123 及 console.log(x) 的 x 都会被建立起来。(console.log(x) 的 x 会因为 scope chain 的关系先在内层找有没有宣告 x ,因为找不到所以往外层找,最後找到 var x = 123,所以内层的 x 会指向外层的 123)
  3. 再来会建构 function 的执行环境以及执行程序码。
  4. 呼叫 function a ,建构 a 的执行环境,将 x 储存在 a 的执行环境。
  5. 准备执行 setTimeout ,外层 a 的泡泡破掉,此时 var x = 123 因为一开始有被分配到记忆体,所以还会留在原地,不会跟着泡泡破掉而消失。
  6. 执行 setTimeout,x 能够指向外层的 123,不会变成not defined。1.

意者另可参考:『所有的函式都是闭包:谈 JS 中的作用域与 Closure』


<<:  Halloween Kills线上看2021

>>:  <Day26> 永丰金iLeader — 委托下单

【设计+切版30天实作】|Day27 - Plans区块 - 怎麽做出背景阴影?原来阴影还可以调数据!

前面完成了「Reviews」区块,今天来完成「Plans」的区块。 数据收集 标题的样式 Font...

Week38 - 各种安全性演算法的应用 - 概念篇 [高智能方程序系列]

本文章同时发布於: Medium iT 邦帮忙 大家好,这几天较有时间,终於可以好好的思考文章 XD...

[Day12] Vite 出小蜜蜂~ Spawn!

Day12 Level Design 接下来我们要开始设计关卡, 小蜜蜂的关卡很单纯,但是背後的心理...

【Day16】Git 版本控制 - 多人协作 Fork(1)

透过前面 15 篇的文章,相信大家已经了解要怎麽利用 git 指令将档案进行版本控制、将档案 pus...

Day26:终於要进去新手村了-Javascript-函式-物件-建构式

今天文章会延续昨天的程序码去做建构式的学习纪录 我们先看看原本的程序码: var player=ne...