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

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

闭包

概念

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

例子

function outer(){    var localVal = 30;    return localVal;}outer();//30function outer(){    var localVal = 30;    return function() {        return localVal;    }}var func = outer();func();//30

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

封装

(function(){    var _userId = 123;    var _typeId = 'item';    var MyExport = {};        function converter(userId){        return + userId;    }        MyExport.getUserId = function(){        return converter(_userId);    }        MyExport.getTypeId = function(){        return _typeId;    }    window.MyExport = MyExport;})();MyExport.getUserId();//123MyExport.getTypeId();//itemMyExport._uerId;//undefinedMyExport._typeId;//undefinedMyExport.converter;//undefined

闭包陷阱

var tasks = [];for (var i=0; i<3; i++) {    tasks.push(function() {        console.log('>>> ' + i);    });}console.log('end for.');for (var j=0; j

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

解决方法

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

var tasks = [];for (var i=0; i<3; i++) {    var fn = function(n) {        tasks.push(function() {            console.log('>>> ' + n);        });    };    fn(i);}//简化语法,直接用匿名函数的立即执行模式(function() { ... })()var tasks = [];for (var i=0; i<3; i++) {    (function(n) {       tasks.push(function() {           console.log('>>> ' + n);        });    })(i);}

总结

优点:灵活方便,封装

缺点:空间浪费,内存泄漏,性能消耗

转载于:https://www.cnblogs.com/y-dt/p/9382782.html

你可能感兴趣的文章
nginx+keepalived构建主主负载均衡代理服务器
查看>>
LED灯的闪烁与熄灭也成了一个iptables target,强汗
查看>>
UVA 1169\uvalive 3983 Robotruck 单调队列优化DP
查看>>
我的友情链接
查看>>
POJ 1703 Find them, Catch them
查看>>
[共通]手机端网页开发问题及解决方法整理
查看>>
HSRP 原理
查看>>
监控队列的脚本
查看>>
我不是九爷 带你了解 CloudStack+XenServer详细部署方案(3):CloudStack管理节点的安装和配置...
查看>>
我的友情链接
查看>>
用户调查报告
查看>>
发布一个php分页类
查看>>
我的友情链接
查看>>
${basePath}
查看>>
linux命令之uniq简单用法
查看>>
使用Eclipse调试Java程序的10个技巧
查看>>
Hive分桶表
查看>>
oracle10g 启动时报错:ORA-32004 ORA-19905
查看>>
思科分发列表过滤路由(RIP)动态路由协议篇
查看>>
PCB应用于哪些方面
查看>>