JavaScript学习笔记—闭包

1. 定义

闭包就是能访问到外部函数作用域中变量的函数

2. 什么时候使用

当需要隐藏一些不希望被别人访问的内容时就可以使用闭包

3. 构成要件

(1)函数的嵌套
(2)内部函数要引用外部函数中的变量
(3)内部函数要作为返回值返回

function outer(){
  let num = 0;
  return () => {
    num++;
    console.log(num);
  }
}
const newFn = outer();
newFn(); // 1
newFn(); // 2
newFn(); // 3
4. 原理

闭包利用的就是词法作用域

let a = "全局变量a";
/*
  函数作用域,在函数创建时就已经确定(又称词法作用域)
  和调用的位置无关
*/
function fn() {
  console.log(a);
}

function fn2() {
  let a = "fn2中的变量a";
  fn();
}

fn2(); // 全局变量a

function fn3() {
  let a = "fn3中的变量a";
  function fn4() {
    console.log(a);
  }
  fn4();
}
fn3(); // fn3中的变量a
5. 一些注意问题
  • 闭包的声明周期
    (1)闭包在外部函数调用时产生,外部函数每次调用都会产生一个全新的闭包
    (2)在内部函数丢失时销毁(内部函数被垃圾回收了,闭包才会消失)
  • 注意事项
    闭包主要用来隐藏一些不希望被外部访问的内容,这就意味着闭包需要占用一定的内存空间
    相较于类来说,闭包比较浪费内存空间(类可以使用原型而闭包不能)
    需要执行次数较少时,才使用闭包;需要大量创建实例,实用类
function outer() {
  let someVariable = "someValue";
  return function(){ // 匿名函数返回
    console.log(someVariable);
  }
}
// 调用函数,产生闭包
outer();

function outer2() {
  let num = 0;
  return () => {
    num++;
    console.log(num);
  }
}
let fn1 = outer2(); // 独立闭包
let fn2 = outer2(); // 独立闭包
fn1(); // 1
fn2(); // 1
// 函数被回收,闭包销毁
fn1 = null;
fn2 = null;
posted @ 2023-01-24 16:35  程序员张3  阅读(18)  评论(0编辑  收藏  举报