从一脸懵逼到掌握闭包 🍉

1,625 阅读3分钟

关于闭包必问的两个问题:

  1. 神魔是闭包
  2. 闭包的作用是神魔?

神魔是闭包?

var local = '变量'
function foo(){
 console.log(local)
}

假设上面三行代码在一个立即执行函数中。 三行代码中,有一个局部变量local,有一个函数foofoo里面可以访问到local变量。那么这就是一个闭包。 函数 和 函数内部能访问到的变量 (也叫环境) 的总和,就是一个闭包

大部分的闭包都是以函数套函数的形式来进行展示的。

比如这个样子:

function foo(){
  var local = 1
  function bar(){
    local ++
    return local
  }
  return bar
}
var func = foo()
func()

local变量和bar 函数就组成了一个闭包。

函数套函数的作用是啥呢?

函数套函数就是为了故意制造出一个局部的变量 local ,如果不把 local放在一个函数里面,local 就成了一个全局的变量,就没有办法做到 闭包的作用(隐藏一个变量)

return bar的作用是啥?

return bar 就是为了让你能够使用这个闭包。为了让外面能够访问到这个bar函数而已。

闭包的作用是神魔?

其实从上面的例子我们已经能够看出来,闭包就是制造一个局部变量,只给外部提供一个可以操作这个变量的方法

比如我们需要发优惠券给用户,我们发的优惠券都是xx-10这种类型的,有人如果不小心改错了数据,将这个xx改成了负数,用户总不能用了优惠券越用越亏吧。 所以我们不允许别人操作这个数据,只提供给他一个方法。

function(){
  var xx =20
  window.加1块钱 = function(){
   xx += 1
  }
  window.减1块钱 = function(){
  xx -= 1
  }
}

那么我们的这个方法就可以调用 window.加1块钱 或者减1块钱 微调优惠券的优惠力度,而不至于直接改数据。

这下又形成了两个闭包:

  1. xx 和 加1块钱的函数
  2. xx和减一块钱的函数

闭包和作用域

var local = '变量'
function foo(){
 console.log(local)
} //在一个立即执行函数中

foo的函数内部可以使用foo函数外部的变量,就符合了闭包的定义。

闭包是 JavaScript 一个非常重要的特性,这意味着当前作用域总是能够访问外部作用域中的变量。因为 函数 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。

闭包会造成内存泄漏吗?

内存泄露是指你用不到(访问不到)的变量,依然占据着内存空间,不能被再次利用起来。 但是闭包里面的变量是我们需要使用的变量,就不能说是内存泄漏

IE浏览器 在我们使用完闭包之后,依然回收不了闭包里面引用的变量。所以会导致这个bug。

所以这其实是IE的问题。

文章参考 :

[1] 方应杭 js中的闭包是什么?

[2] JavaScript秘密花园

如果对你有帮助的话,请点个👍吧!我会继续分享更多文章的~

本文使用 mdnice 排版