JS 中闭包的实例展示和应用

0 下载量 171 浏览量 更新于2024-09-01 收藏 63KB PDF 举报
js中的闭包实例展示 闭包是JavaScript中一个重要的概念,准确来说,闭包是基于正常的垃圾回收处理机制下的。也就是说,一般情况一个函数(函数作用域)执行完毕,里面声明的变量会全部释放,被垃圾回收器回收。但闭包利用一个技巧,让作用域里面的变量,在函数执行完之后依旧保存没有被垃圾回收处理掉。 闭包的定义:MDN定义javascriptkit词法作用域。闭包的三大特点为: 1. 函数嵌套函数 2. 内部函数可以访问外部函数的变量 3. 参数和变量不会被回收。 作用域链:函数在执行的过程中,先从自己内部找变量如果找不到,再从创建当前函数所在的作用域(词法作用域)去找,以此往上注意找的是变量的当前的状态。作用域链的博客函数连同它作用域链上的要找的这个变量,共同构成闭包。 使用闭包主要是为了: 1. 封装数据 2. 暂存数据 一个典型的闭包案例: function car(){ var speed = 0 function fn(){ speed++ console.log(speed) } return fn } var speedUp = car() speedUp()//1 speedUp()//2 在这个例子中,当函数内部没有执行以下的代码时: function fn(){ speed++ console.log(speed) } return fn 在代码执行完成后,函数内部的局部变量speed就会被销毁,由于全局标量speedUp一直存在(除非关闭当前页面,否则全局变量一直存在),那么函数内部的作用域就没有办法被销毁,里面有东西一直被使用,这点与浏览器的垃圾回收机制相仿,当我们执行speedUp(),他会在函数的词法作用域下去寻找,函数里面又返回了一个fn,因而形成闭包,简单的理解为: var speed = 0 function fn(){ speed++ console.log(speed) } 这一段代码形成一个闭包,如果不return fn,那函数内部的局部变量就会被销毁。 我们可以看看上述代码利用立即执行语句和立即执行函数可以怎么演变: function car(){ var speed = 0 function fn(){ speed++ console.log(speed) } return fn } var speedUp = car() //1 function car(){ var speed = 0 return function(){ speed++ console.log(speed) } } 在这个例子中,我们可以看到闭包的强大之处,它可以让函数内部的变量在函数执行完毕后依旧保存不被销毁,并且可以被外部函数访问和修改。