相信大多数接触过js编程的程序员或多或少都对js中的闭包了解一些吧,所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包是 ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下。如果想要扬长避短地使用闭包这一特性,则必须了解它们的工作机制。而闭包工作机制的实现很大程度上有赖于标识符(或者说对象属性)解析过程中作用域的角色。
下面我举一个简单的函数执行来说明闭包的工作原理:
我们所熟知的主流语言,像C,java等,在函数内部只要执行了return,函数就会返回结果,然后内存中删除该函数所在的区域.生命周期也就停止了.一般的js函数也是这样.但是有闭包特性的js函数有点特殊.就例子来说:function a(){ var i=0; function b(){ alert(++i); } return b;}var c = a();c(); 这是个标准的闭包.在函数a中定义了函数b,a又return了b的值.这些可以先不管.var c = a();c();这两句执行很重要.在var c = a();这行里,执行了a函数,那么肯定a经过了return.按照主流语言的函数特性,现在c的值就是a的返回值.第二行c()的执行实际执行的就是b函数.最后不管执行的是谁,会弹出一个值为0的窗口,到此为止,所有的生命周期按理论来说就算全部结束了.可是,如果我们再多执行一行.var c = a();c();c();第一次弹出0,第二次执行却弹出了1. 也就是说,第一次c()后,a中的i依然保留.自然a在内存的栈区依然保留. a是return过了,但是,a及内部值却依然存在,这就是闭包.在一般的程序中,我们使用闭包主要是为了一个变量的使用,在一个函数的作用域里面定义的变量,不会影响到后面的变量,但是这个方法却可以进行调用这个变量的值,主要的作用就是保护了函数的安全性。
以上便是一个简单的js函数闭包的列子。
时间: 2024-10-13 11:22:39