javaScript必考的面试题之闭包

  • 前言

    面试官在面试前端的时候基本都会问到什么是是闭包,因为闭包会涉及到垃圾的回收机制,作用域及作用域链。这里我发表一下本人对闭包的理解,也希望大佬们给到我指点以及纠正。

  • 什么是闭包

    本人在JavaScript高级程序设计(第四版)“红宝书”上面看到是这么描述闭包的:闭包指的是那些引用了另一个函数作用域中变量的函数

    这句话是什么意思呢:简单来说就是函数A用到了B函数中的变量,那么函数A就是个闭包,其实闭包就是个函数

    我们看一下代码示例
//  声明一个名为B的函数
function B() {
  var b = 2
    function A() {
      console.log(b);  //函数A访问了函数B里面的变量
    }
}

此时A( )函数就是一个闭包函数,看到这里想必小伙伴们都知道什么是闭包了吧

  • 闭包的作用

    看完上面的东西,很多人心里在想小编你这说了跟没说有什么区别,大家别急,先看完我慢慢道来。

    1.大家想想如果我们在B函数外面输出B会怎么样呢

//  声明一个名为B的函数
function B() {
  var b = 2
    function A() {
      console.log(b);  //函数A访问了函数B里面的变量
    }
}
B()  //调用函数
console.log(b);  //B函数外部输出b的值 => b is not defined

直接奖励了一个报错 b is not defined 代码写了多的小伙伴肯定知道这样是不行的,到底为什么不行呢,这里就涉及到了JS的垃圾回收机制

2.垃圾回收机制:(浅谈)
JS代码在运行时会每隔一段时间来回收掉那些没有在用的变量,并且释放其所占用的内存,简单来说就是为了防内存泄漏。

垃圾的回收机制主要有两种方法《标记清除》和《引用计数》

这里我们简单的说一下《标记清除》的方法。下面的执行环境大家可以理解为执行上下或作用域。
就拿上面的代码来说,当JS代码在执行时,首先会进入全局执行环境,当代码调用函数B时,代码就会进入B函数执行环境。此时会标记B函数内部的变量b为“进入环境”。当B函数代码执行完毕后,会退出B函数的执行环境,则将B函数内部的变量b标记为“离开环境”。被标记“离开环境”的变量就会被回收掉内存。
综上所述就可以知道为什么会报错了,因为函数内部的变量已经被销毁掉了。
3.我们再想想怎么才能外部使用函数内部的变量?这里就可以应用到闭包的知识点了
示例代码

//  声明一个名为B的函数
function B() {
  var b = 2
   return function A() {
      return b
    }
}
var ser = B()
console.log(ser());  //此时返回的是一个2
  • 总结

    闭包的主要作用是防止函数在执行完毕后被回收掉 ,被延伸变量使用的范围。

  • 使用注意点

    在使用闭包的时候往往会容易导致内存泄漏的问题,当我们不在使用闭包内的变量时记得要把所占的内存释放掉。直接使用 ser = null 就可以释放掉内存 。
    持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值