闭包(closure)与递归

440 阅读2分钟

闭包(closure)

传送门:developer.mozilla.org/zh-CN/docs/…

image.png

一. 闭包的定义

  • 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树