闭包是什么
在 JS 忍者秘籍(P90)中对闭包的定义:闭包允许函数访问并操作函数外部的变量。红宝书上对于闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数。
MDN 对闭包的定义为:闭包是指那些能够访问自由变量的函数。这里的自由变量是外部函数作用域中的变量。概述上面的话,闭包是指有权访问另一个函数作用域中变量的函数
形成闭包的原因
内部的函数存在外部作用域的引用就会导致闭包。从上面介绍的上级作用域的概念中其实就有闭包的例子 return f就是一个表现形式。
1 | var a = 0 |
这里的子函数 fo 内存就存在外部作用域的引用 a, b,所以这就会产生闭包
闭包的作用
保护函数的私有变量不受外部的干扰。形成不销毁的栈内存。
保存,把一些函数内的值保存下来。闭包可以实现方法和属性的私有化
使用闭包需要注意什么
容易导致内存泄漏。闭包会携带包含其它的函数作用域,因此会比其他函数占用更多的内存。过度使用闭包会导致内存占用过多,所以要谨慎使用闭包。
闭包应用
1.函数防抖
比如要缩放窗口 触发onresize 事件 需要在这时候做一件事情,但是我们希望拖动的时候只触发一次,比如
1 | window.onresize = function(){ |
一般方法vs闭包
1 | window.onresize = function(){ |
1 | window.onresize = debounce(fn,500) |
2.使用闭包设计单例模式
1 | class CreateUser { |
3.为多个组件独立属性
假如我现在要在页面中使用echarts画6个线状图,需要6个容器
需要为每个容器元素声明一个独立id,不然会混乱
1 | constructor(){ |
4.设置私有变量
内部属性 在java里使用private就可以,但是js 还没有这个东东
1 | let _width = Symbol(); |
5.拿到正确的值
1 | for(var i=0;i<10;i++){ |
遇到这种问题 如何用解决呢
1 | for(var i=0;i<10;i++){ |
原理是 声明了10个自执行函数,保存当时的值到内部