最近几天看了好多文章,学习闭包。
普遍认为,闭包是JavaScript中高深的技术,也是最实用的技术,也是最难懂的技术,也是JavaScript的精华。
什么是闭包?一句话说不清楚。也缺乏一个完整的定义。官方解释:绑定了数据和数据存在的环境的一个技术。
下面是一个使用闭包技术的例子:
最终目的是访问局部变量localnum,为什么搞得这么复杂?
JavaScript编程中,一个变量如果不在函数中定义,那么它就是公用变量,作为公用变量谁都可以访问它,也可能改变它。如果不想让它接受不可靠的访问,应该定义成局部变量。局部变量必须在函数内部定义。所以,上述为了定义了一个局部变量localnum,构造了一个函数fun()。
但是局部局部变量只能在函数内部存在,只能在函数内部被使用,被变化。所以在外部函数fun内部创建了一个内部函数nbfun来调用或者改变局部变量localnum。
局部变量只能通过内部函数来访问或者变化,那我们怎么才能使用内部函数呢?闭包技术为我们打开了一扇窗户,那就是return nbfun,通过返回内部函数的方式让我们使用内部函数nbfun。
例子中,用变量n来调用函数fun,其实质调用的是内部函数nbfun。通过n()来使用它。
一般来说,函数调用完毕就会被销毁,占用空间会被收回,这时局部变量localnum也就不存在了。但是,上述代码中,由于n=fun()调用的存在,内部函数nbfun被使用,外部函数fun作为内部函数nbfun存在的前提,不能被销毁。这就像内部函数nbfun围绕localnum这个核心,共同作为一堆东西而存在。外部函数fun像一个包单一样,把这些东西保护起来,外部看起来就像是一个封闭的包裹,所以它有一个形象的叫法:闭包。其实它是一个技术手段。
闭包技术保护了数据,又不影响使用数据。闭包中除内部数据以外的东西,就是官方所称的被保护的数据保持存在所需要的环境。
我们不得不佩服这种构思的巧妙。
闭包技术为啥是高端技术?因为它不好理解。高深莫测的技术一定是高端技术。