闭包(closure)
传送门:developer.mozilla.org/zh-CN/docs/…
一. 闭包的定义
-
1.闭包 : 是一个可以访问其他函数作用域的函数
- 闭包 = 函数 + 上下文的引用,闭包不等于函数。以下代码就构成了闭包:
function fn(){
let a = 1
function fn1() {
console.log(a)
}
fn1()
}
执行函数
fn1用到了另一个函数fn中的a这个变量,所以fn1 + a构成了闭包。
二. 闭包的作用
直接作用:解决变量污染问题,让变量被函数保护起来。
示例代码如下:
let count = 0
setInterval(function () {
console.log(count++)
}, 1000)
以上代码中的 count 是一个使用频率很高的变量名,为了避免和其他位置的代码冲突,可以再使用一个函数把以上代码包裹起来,起到保护作用。
function fn() {
let count = 0
setInterval(function () {
console.log(count++)
}, 1000)
}
以上代码中,setInterval 第一个参数的匿名函数与 count 构成了闭包。
将以上代码改写如下:
function fn() {
let count = 0
function add() {
console.log(count++)
}
setInterval(add, 1000)
}
以上代码中,add + count 构成了闭包。
结论:一个函数内使用了外部的变量,那这个函数和被使用的外部变量一起被称为闭包结构,在实际开发中,通常会再使用一个函数包裹住闭包结构,以起到对变量保护的作用。
递归
1-递归函数介绍
-
1.递归函数:一个函数自己调用自己
-
2.递归函数特点
- a.一定要有结束条件,否则会导致死循环
- b.能用递归函数实现的需求,就一定可以用循环调用函数来解决,只是代码简洁与性能不同而已
//一个函数递归
function fn(){
console.log('哈哈');
fn();
};
fn();
//两个函数递归
function fn1(){
console.log('哈哈');
fn2();
};
function fn2(){
console.log('呵呵');
fn1();
};
fn2();
//需求:写一个函数,打印三次
let i = 1;
function fn(){
console.log('宝宝');
i++;
if(i <= 3){
fn();
};
//循环实现
// for(let i = 1;i<=3;i++){
// console.log('宝宝`');
// };
};
fn();
2-递归应用场景:浅拷贝与深拷贝
浅拷贝与深拷贝概念主要针对于对象这种数据类型
1.浅拷贝: 拷贝的是地址
- 特点:修改拷贝后的数据,原数据也会随之修改
2.深拷贝:拷贝的是数据
- 特点:修改拷贝后的数据,对原数据没有影响
高频面试点
闭包
-
什么是闭包:以下两种回答都可以
- 闭包是一个访问其他函数内部变量的函数
- 闭包是 函数 + 上下文代码组合
-
闭包作用:解决变量污染
递归
-
什么是递归:函数内部调用自己
-
递归场景
- 深拷贝
- 遍历dom树