文章标题

来源:互联网 发布:恒久软件 义齿 编辑:程序博客网 时间:2024/06/05 04:02

定义

闭包定义(closures):是使用被作用域封闭的变量,函数,闭包等执行的一个函数作用域

闭包是指这样的作用域,它包含有一个函数,这个函数可以调用被这个作用域所封闭的变量、函数或者闭包等内容

js 闭包,在表现形式上来说就是在函数里面再定义一个函数,这个函数的作用域并不是在它定义的这个函数中,而是在全局作用域之内,但是作用域链却可以找到上级函数,获取上级函数之内的内部变量

闭包简单使用场景:

循环闭包

在循环中执行异步操作时,因为执行时循环早已结束,循环体中的变量的值已经固定,所以再引用变量时值是固定不变的

在js中,没有块级作用域,只有函数作用域。可以采用“立即执行函数”的方式创建作用域

for(var i = 0, len = btns.length; i < len; i++) {(function(i) {    btns[i].onclick = function() {        alert(i);    }}(i))

}

封装私有变量

将一些不希望暴露的全局变量封装成私有变量

虽然js不提供原生支持的方法声明私有变量,但是可以使用闭包模拟私有变量和方法。私有方法不仅仅有利于限制对代码的访问,还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱代码的公告接口部分

var num = (function(){    var num = 0;    return {        set:function(val){            return num = val;        },        get:function(){            return num;        }    }})()

延长局部变量寿命

原理上就是把局部变量发送到全局变量里面,这样就不会在函数一运行完毕就销毁掉,而是强制保存已完成的变量

var report = (function() {    var imgs = [];    return function(src) {        var img = new Image();        imgs.push(img);        img.src = src;    }}())

性能

闭包会对脚本性能具有负面影响,处理速度和内存消耗,因为闭包的基本作用就是强制保存应该被销毁的函数以及变量,只要局部变量不被销毁,那么这个保有这个变量的函数就不会被销毁,这样子局部变量的内存和函数的栈都在内存中存在

原创粉丝点击