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外部变量作为参数传进来,打破了这种问题。
这是目前我遇到的两种作用