一文彻底理解js必包

90 阅读2分钟

定义

闭包是指有权访问另一个函数作用域中的变量的函数,通常是在嵌套函数中实现。

function fn1(){
  var a = 1;
  return function fn2(){
    console.log(a++);
  }
}
var fn = fn1();
fn();//1
fn();//2

必包的设计解决了什么问题

动态作用域难以模块化的问题

必包优缺点

优点

  • 保护私有变量,避免全局污染
  • 延长变量生命周期
  • 实现模块化
  • 保持状态

缺点

  • 内存占用
  • 性能损耗:涉及到作用域链查找过程

必包怎么回收

如果必包引用的函数是全局变量,那么必包会一直存在到页面关闭,如果这个必包以后不在使用的话,就会造成内存泄露 如果这个必包引用的是局部变量,等函数销毁后,在下次JavaScript引擎执行垃圾回收时,判断必包这块内容如果不再被使用了,那么Javascript引擎垃圾回收器就会回收这块内存

应用场景

  • for循环
  • 封装私有变量和函数
  • 模块化实现
  • 实现高阶函数
  • 实现回调函数
  • 模拟块级作用域
  • React Hook

for循环

for(var i = 0; i < 9; i++){
  (function(i){
    console.log(i);
  })(i)
}

封装私有变量和函数

function createPerson(){
  var _name;
  return {
    getName:function(){
      return _name;
    },
    setName:function(name){
      _name = name;
    }
  }
}
var lwp=createPerson();
lwp.setName('兰为鹏')
console.log(lwp.getName())//兰为鹏

模块化实现

(function(){
  function add(a, b){
    return a + b;
  }
  function sub(a, b){
    return a - b;
  }
  globalThis.countFn={
    add:add,
    sub:sub
  }
})();
var sum=countFn.add(1,2);
console.log(sum)

实现高阶函数

function addBy(a){
  return function(b){
    return a + b;
  }
}
var addTwo = addBy(2);
console.log(addTwo(5))

实现回调函数

function getNameAync(cb){
  setTimeout(()=>{
    cb && cb('lwp');
  },2000)
}
getNameAync((name)=>{
  console.log(name);
})

React Hook

hook实现.png

参考


很多面经找起来很麻烦,也找不全,然后还得自己找答案,有些面试宝典虽然完整,但是看不懂,因此干脆自己进行整理,整理最全的前端面试题以及最容易理解的答案,附上参考链接或者视频链接,再加上自己调试的代码,我不相信这样还看不懂。 地址

也可以一起讨论:wx:lan_weipeng备注前端面试群