博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript闭包
阅读量:6690 次
发布时间:2019-06-25

本文共 1264 字,大约阅读时间需要 4 分钟。

闭包的含义和作用

1、根据JavaScript作用链,只能在内部访问到外部函数,通过闭包外部也可以访问内部变量。

2、js有垃圾清理机制,当一个对象使用后会自动清理,闭包可以使变量一直保存在内存中不会被清理。

正常情况下的访问 inner内部函数可以访问到变量a,但是outer访问不到inner的变量b

`
function outer (){

let a = 1;function inner(){    let b = 2;    console.log(a); //1}

}

`
使用闭包可以当函数执行完后变量仍然保持,将c保存到返回的inner1函数里,当outer1执行完后,c并不会被销毁而是返回到inner函数中。
调用outer1()后,返回了inner1赋值给closure。再执行closure可以即从外部获得变量c

function outer1(){    let c = 99;    //将变量返回到内部函数中    return function inner1(){        return c;    }}let closure =  outer1();let c1 = closure() // 99

用闭包来解决在循环中遇到的相关问题

当给多个元素绑定点击事件时使用循环遍历绑定的方法,点击绑定事件是异步回调的方法,所以会等到循环结束后才将i返回,以下会导致的问题就是无论点击哪个元素都只会打印3

div0
div1
div2

使用闭包,封装成一个独立的立即执行的匿名函数,将每次循环的i作为参数传进去,这样就可以在执行的时候取到当前i的值而不是循环结束后的值,分别点击div都是打印的是0,1,2

for(var i=0;i<3;i++){    (function(n){        var div = document.getElementById('div'+n).addEventListener('click',function(){            console.log(n)        })    })(i)}

同理setTimeout也是异步回调,如果没有使用闭包将它包裹会打印三次3

function(){    for(var i=0;i<3;i++){        setTimeout(()=>{            console.log(i)        },0)    }}

使用闭包后分别打印出0,1,2,3,4,5

for(let n=0;n<6;n++){    (function(m){        setTimeout(()=>{            console.log(m)        },0)    })(n)}

注意事项

使用闭包会导致内存外泄,因为当函数执行完后里面的变量并没有被垃圾清除机制清理,过多使用闭包会影响性能。

转载地址:http://pwuoo.baihongyu.com/

你可能感兴趣的文章
阅读SSH的ERP项目【第二篇】
查看>>
如何有效的避免OOM,温故Java中的引用
查看>>
NSHipster: NSRegularExpression 中文版
查看>>
Android 开发中不得不知道的 Tips 集合 (持续更新 ing)
查看>>
报警系统QuickAlarm之报警规则的设定与加载
查看>>
【CLI】使用 Curl 下载文件实时进度条显示
查看>>
Android 滤镜效果和颜色通道过滤
查看>>
Ruby开发者已可通过Fog管理Microsoft Azure服务
查看>>
Chrome和HTTPS:安全Web的征途
查看>>
软件专家的对话模式(第一部分)
查看>>
脚本填报表的条件查询
查看>>
从一个开发的角度看负载均衡和LVS
查看>>
Spring Boot(12)——使用MongoDB
查看>>
c++基础(上) 听课流水账
查看>>
Observable
查看>>
k8s使用deployment升级
查看>>
ionic3项目实战教程 - 第10讲 ionic3分类菜单设计(类似外卖)
查看>>
深度解析 | K8S API Server之入门须知
查看>>
LeanEngine 中使用 WebSocket
查看>>
浅入分析和Linux内核相关的文件夹/proc和/sys .
查看>>