题解闭包

参考
来源:https://www.bilibili.com/video/BV1sN411974w?p=2
细讲:

https://blog.csdn.net/qq_39903567/article/details/115010640

彻底理解js闭包 - 知乎 (zhihu.com)

闭包 - JavaScript | MDN (mozilla.org)

学习Javascript闭包(Closure) - 阮一峰的网络日志 (ruanyifeng.com)

1. 知识

闭包

  • 函数创建和函数执行不在同一个作用域下就会形成闭包

  • 闭包是指那些能够访问自由变量的函数

    自由变量:是指在函数中使用的变量即不是函数参数arguments也不是函数内部声明的变量,那这个变量就是自由变量

  • 闭包是指有权访问另外一个函数作用域中的变量的函数

如何判断

  • 内部的函数被保存到外部

典型闭包

function a() {
    var aa = 123
    function b() {
        var bb = 234
        console.log(aa)
    }
    return b // 外部函数返回的是内部函数的结果
};
var res = a(); // 将内部函数b保存到res了实际上,因此可以通过引用外部函数的变量实现保存变量
res();

2. 题目

以下题目实际上是保存变量n

function fun(n, o) {
  console.log(o);
  return {
    fun: function (m) {
      return fun(m, n);
    }
  };
}

var a = fun(0); // 输出1:n为0(保存),o为undefined.执行返回了一个对象被a引用了,形成闭包fun中的变量没有被销毁
a.fun(1); // 输出2:n为1,o为0;m为1,n使用自由变量(之前的n)1
a.fun(2); // 输出3:n为2,o为0;m为2,n使用自由变量(之前的n)1
a.fun(3); // 输出4:n为3,o为0;m为2,n使用自由变量(之前的n)1
var b = fun(0).fun(1).fun(2).fun(3); // 输出5:
/*
fun(0):n为0,o为undefined.执行返回了一个对象 // undefined
fun(0).fun(1):n为0(自由变量),o为undefined;对象.fun(1):fun(1,0) // 0
fun(0).fun(1).fun(2):n为0(保存),o为undefined;对象.fun(1):fun(1,0);对象.fun(2):fun(2,1) // 1
fun(0).fun(1).fun(2).fun(3):n为0(保存),o为undefined;对象.fun(1):fun(1,0);对象.fun(2):fun(2,1);对象.fun(3):fun(3,2) // 2
*/
var c = fun(0).fun(1); // ?
c.fun(2); // ?
c.fun(3); // ?

3. 过程

执行见题目注释

4. 答案

// 1
undefined
// 2
0
// 3
0
// 4
0
// 5
undefined
0
1
2
// 6
undefined
0
// 7
1
// 8
1
posted @ 2022-03-11 09:11  沧浪浊兮  阅读(27)  评论(0)    收藏  举报