函数闭包
-
函数就是闭包,当一个函数被创建时,它的内部的语句、变量、函数等,共同形成了闭包。
这里简单分析下闭包函数执行调用过程
function outer(){
var a = 12;
//形成闭包环境中的变量不是一成不变的,可以被更改
function inner(){
console.log(a ++);
}
return inner;
}
var inn = outer();
inn();
inn();
闭包的用途:
可以在函数外部读取函数内部成员
让函数内成员始终存活在内存中
闭包存在的问题
//闭包的问题
var arr = [];
for(var i = 0;i <= 10;i ++){
arr[i] = function (){
console.log(i);
}
}
//应该是输出对应下标
arr[0]();//11
arr[1]();//11
arr[2]();//11</pre>
这个代码只是想实现根据arr下标,console.log出相应的值。但是当调用时,for循环中的i已经执行完了,i = 11。i的作用域太大了,执行时,i的结果就已经执行完了。
解决方法就是形成一个闭包,将i的作用域从全局缩小变成局部作用域,arr[i]()
每执行一次,i的值就执行一次,使i的值依旧可以使用。
//解决
var arr = [];
for (var i = 0; i <= 10; i++) {
//自调用函数
(function (i){
arr[i] = function () {
console.log(i);
}
})(i);
}
//应该是输出对应下标
arr[0]();//0
arr[1]();//1
arr[2]();//2