闭包简单的说就是一个函数能访问外部函数的变量,这就是闭包。
function a(x){
var tem=3;
function b(y){
console.log(x+y+(++tem));
}
}
a函数中的b函数就是闭包了,b函数可以使用a函数的局部变量,参数。
最典型的闭包应该是下面这样,将定义在函数中的函数作为返回值。
function a(x) {
var tem = 3;
function b() {
console.log(x + (++tem));
}
return b();
}
a(2);
得到的结果为6
for(var i=0;i<2;i++){
setTimeout(function(){
console.log(i);
},0);
}
上面这段代码的执行结果是2,2而不是0,1,因为等for循环出来后,执行setTimeout中的函数时,i的值已经变成了2,这就是没有隔离作用域所造成的,请看下面代码
for(var i=0;i<2;i++){
(function(i){
setTimeout(function(){
console.log(i);
},0)
})(i);
}
这样就会输出0,1,我们的立即执行函数创建了一个作用域,隔离了外界的作用域。
插曲:
一种不使用for和while循环,能输出1~100的方法
<script type="text/javascript">
var i = 1;
var timer = setInterval(function () {
if (i >= 100) {
clearInterval(timer);
}
console.log(i++);
}, 10);
</script>
闭包的缺点:
因为内部闭包函数可以访问外部函数的变量,所以外部函数的变量不能被释放,如果闭包嵌套过多,会导致内存占用大,要合理使用闭包。