JavaScript学习日记 : Day13 - 闭包(Closure)

当一个函数被建立时,闭包就会被产生,虽然常见的闭包说明方式会使用巢状函数当作例子,这是最常见的例子没错,但是并不是只有巢状函数才能产生闭包。

直接举一个例子:

function func() { // func1引用了它外层的变数a,因此func成为了闭包
    let a = 123
    function func1() {
        console.log(a) //访问了外层的func内的a
        debugger;
    }
    func1();
}
func()

上图可得知函数建立时就会存在闭包了,再进入call stack中的func1

进入func1後,可以发现closure进到了Scope,代表闭包也算是作用域的一种。

return function

直接举一个例子说明:

function getIntro(height,weight) {
    function addString() {
        console.log(`身高${height},体重${weight}`)
    }
    return addString
}

let getIntroString = getIntro(180,70);
getIntroString();
  1. getIntro函数传入两个参数,这两个参数作用域就在getIntro funciton中,如果没有被存取或是参考的话就会从记忆体中释放。
  2. 内层addString函数存取height与weight,该函数内找不到所以往上找到getIntro function内的。
  3. addString并不是马上执行,而是当作getIntro function的返回值,赋值给getIntroString。
  4. 运行getIntroString,会运行内层的addString,并且存取height与weight,因为height与weight还是维持有被参考,所以并不会被记忆体释放而回收,变成了getIntroString的私有变数。

另外返回的function是可以重复且独立使用,闭包内的变数是互相独立的,举个例子:

function plusNum() {
    let initNum = 100;
    return function(num = 0) {
        initNum+=num
       console.log(`current num is ${initNum}`)
    }
}

let plusNumA = plusNum();
plusNumA(); // current num is 100
plusNumA(10); // current num is 110
plusNumA(20); // current num is 130

let plusNumB = plusNum();
plusNumB(); // current num is 100
plusNumB(20); // current num is 120
plusNumB(40); // current num is 160


<<:  【Day10】ERP核心模组篇-Manufacturing

>>:  DAY 13- 《公钥密码》-RSA(1)

【Day 28】Self - defined Data Types

有碰过 python 的朋友们应该都知道,在 python 中,list 是可以存任何型态的东西,即...

Day 14 - Grid 排版

如果上一篇威尔猪讲的 Flex 是十字形排版法,那今天讲的 Grid 就属於棋盘格排版法。它比 F...

[Java Day20] 4.8. 确定化

教材网址 https://coding104.blogspot.com/2021/06/java-f...

[Day 29] 实作-axios 串接api

先看一下有哪些api 下面列出这次用到的openapi, 可以看到他有一个共通的domain htt...

Day 0x5 - 请求 API 前的前置动作(Part 2)[IV, Message(AES-CBC)]

0x0 前言 继昨日,Sign的篇幅跟测试的时间花比较久,因此拆成part 1, 2 0x1 IV ...