题解闭包
参考
来源:https://www.bilibili.com/video/BV1sN411974w?p=2
细讲:https://blog.csdn.net/qq_39903567/article/details/115010640
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
本文来自博客园,作者:沧浪浊兮,转载请注明原文链接:https://www.cnblogs.com/shixiu/p/15992200.html

浙公网安备 33010602011771号