JavaScript函数——闭包

闭包

概念

只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁

例子

1function outer(){ 2 var localVal = 30; 3 return localVal; 4} 5 6outer();//30 7 8function outer(){ 9 var localVal = 30; 10 return function() { 11 return localVal; 12 } 13} 14 15var func = outer(); 16func();//30

作用:比如在一个函数中嵌套一个函数,通过闭包可以让嵌套函数访问到包裹它的函数的局部变量。

封装

1(function(){ 2 var _userId = 123; 3 var _typeId = 'item'; 4 var MyExport = {}; 5 6 function converter(userId){ 7 return + userId; 8 } 9 10 MyExport.getUserId = function(){ 11 return converter(_userId); 12 } 13 14 MyExport.getTypeId = function(){ 15 return _typeId; 16 } 17 window.MyExport = MyExport; 18})(); 19 20MyExport.getUserId();//123 21MyExport.getTypeId();//item 22 23MyExport._uerId;//undefined 24MyExport._typeId;//undefined 25MyExport.converter;//undefined

闭包陷阱

1var tasks = []; 2 3for (var i=0; i<3; i++) { 4 tasks.push(function() { 5 console.log('>>> ' + i); 6 }); 7} 8 9console.log('end for.'); 10 11for (var j=0; j<tasks.length; j++) { 12 tasks[j](); 13}

输出结果都为3。这个问题的原因在于,函数创建时并未执行,所以先打印end for.,然后才执行函数,由于函数引用了循环变量i,而i的作用域是整个函数,而不是循环,在函数执行时,i的值已经变成了3。

解决方法
再创建一个函数,将循环变量作为函数参数传入:

1var tasks = []; 2 3for (var i=0; i<3; i++) { 4 var fn = function(n) { 5 tasks.push(function() { 6 console.log('>>> ' + n); 7 }); 8 }; 9 fn(i); 10} 11 12//简化语法,直接用匿名函数的立即执行模式(function() { ... })() 13 14var tasks = []; 15 16for (var i=0; i<3; i++) { 17 (function(n) { 18 tasks.push(function() { 19 console.log('>>> ' + n); 20 }); 21 })(i); 22}

总结

优点:灵活方便,封装
缺点:空间浪费,内存泄漏,性能消耗

点赞
收藏

评论区

加载中...

相关推荐

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

JS - 从执行上下文的角度来理解闭包

今天看到一篇关于闭包的文章,里面有这样一句话“就我而言对于闭包的理解仅止步于一些概念,看到相关代码知道这是个闭包,但闭包能解决哪些问题场景我了解的并不多”,这说的不就是我么,每每在面试中被问及什么是闭包,大部分情况下得到的答复是(至少我以前是)A函数嵌套B函数,B函数使用了A函数的内部变量,且A函数返回B函数,这就是闭包。而往往面试官想要听到的并不是这样的

一篇文章带你了解JavaScript 函数闭包

大家好,我是前端进阶者。JavaScript变量属于本地或者全局范围,使用闭包可以让私有变量成为可能。一、全局变量一个函数可以访问所有定义在函数内部的变量。functionmyFunction()vara4;returnaa;但是函数也可以访问定义在函数之外的变量。vara4;//全局变量funct

一篇文章教会你什么是闭包

原文链接:什么是闭包?闭包的概念并不复杂,但是它的定义比较绕(就像平时经常用到它,却又说不出来是什么)。可以在一个作用域中调用函数的内部函数并访问到该函数中的作用域的成员,这就是闭包。给一个建议,网上闭包的概念可以搜出来一大堆,但是你真的了解它吗?你有去调

你不可不知的JS面试题(第三期)

1、什么是闭包?如图所示,闭包就是一个定义在函数内部的函数,其作用是将函数内部和函数外部连接起来。大家知道,作用域的问题,就是在函数内部定义的变量称为局部变量,外部取不到值。下面我们通过代码来更加详细地看一下:function A()       let x  1;       return function B()           c

JavaScript函数——闭包 - HelloWorld