js的闭包

Wikipedia对闭包的定义是这样的:
In computer science, a closure is a function together with a referencing environment for the nonlocal names (free variables) of that function.

从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据。

 

var a=[];
function test()
{
for(var i=0;i<6;i++)
{
a[i]=i;
}
}
test();
for(var j in a)
{
document.write(a[j]+'</br>');
}

这个如果按照定义也算是闭包了,但是我们普通也可以访问a.

由于普通函数外部定义的变量都可以访问,因此一般只有嵌套的函数我们才会重点研究,大家常说的也是嵌套的是闭包。

 

在我理解看来嵌套函数的闭包有两个作用:

① 保证对外函数内部的变量访问,保证变量一直存在在内存里,这样还能保证数据的安全性。

 function a(){
var i=0;
function b(){
     i++;//可以对a内部的变量修改,同时还可以通过return b来返回i,保证了i长存内存内,还能进行修改,还能访问到i
alert(i);
}
return b;
}
var c = a();
c();

 ② 解决块级域带来的函数执行时外部变量的值是有运行时决定,而不是定义的时候决定的,例如如下例子:

var tasks = [];
for (var i = 0; i < 5; i++) {
tasks[tasks.length] = function () {
document.write('Current cursor is at ' + i + '</br>');
};
}

var len = tasks.length;
while (len--) {
tasks[len]();
}

var tasks = [];
for (var i = 0; i < 5; i++) {
tasks[tasks.length] = (function(i){
return function () {
document.write('Current cursor is at ' + i + '</br>');
}
})(i);
}

var len = tasks.length;
while (len--) {
tasks[len]();
}

结果打印

Current cursor is at 5
Current cursor is at 5
Current cursor is at 5
Current cursor is at 5
Current cursor is at 5
Current cursor is at 4
Current cursor is at 3
Current cursor is at 2
Current cursor is at 1
Current cursor is at 0

我们看到了,其实第一个函数,运行后和我们预期是不一样的,这是Lift效应,因此加一个闭包,将i外部变量作为参数传进来,打破了这种问题。

 

这是目前我遇到的两种作用

 

posted on 2015-03-04 22:43  hhjiang  阅读(295)  评论(0编辑  收藏  举报