难道是因为别的同学都出去跨年了所以我学习的心被打乱了吗,我竟然把我闭包的笔记删掉了。。。当看到的时候,脑壳一阵昏,下面给他补上。
在我们学习js的过程中肯定都接触过闭包,所以大家也都知道闭包的重要性,那么什么是闭包呢?
闭包就是在一个函数的内部定义了另外一个函数,并且把它拿到了外部来执行,这就是闭包,并且这个被抛出来的函数还会一直拿着父级函数的作用域中的值,正常情况下一个函数执行完就会被销毁,但是因为闭包的原因,他的作用域并不会被销毁,所以就造成了内存泄漏。内存泄漏这个名词需要好好理解的。(setTimeout()中写的是一个字符串而不是一个函数也会造成内存泄漏)
请看下面这个经典的for循环中产生闭包的例子:
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
}, 1000);
}
这个循环应该输出什么呢? 这个循环我们写出他就是想让他输出0-9这十个数字,但是他并不会满足我们的愿望,因为他输出了十个10,大家是不是很好奇,为什么会是十个10呢,怎么说也应该十个9吧。这是因为i的最后一个值是10,当i= 10时就不在进行循环,所以i最后的值等于10,那么肯定也就输出十个10了,像这种情况就是形成了闭包,还有一种情况也是闭包:
function fn(){
var a = 10;
function fun(){
console.log(a);
}
bar(fun);
}
function bar(foo){
foo();
}
fn();
形成闭包我们应该怎么解决呢? 就拿第一个for循环来说,使用立即执行函数可以完美的解决闭包的问题:
for(var i = 0; i < 10; i++){
(function(j){
setTimeout(function(){ //这个括号里不能填j 否则会打印出undefined
console.log(j);
},1000)
}(i));
}
这样就会按照我们理想中打印出0-9了。闭包有好也有坏,在实际应用中用到的次数还是挺多的,有时候发现一个函数执行结果并不是预期中那样,那就要看看是不是闭包在搞鬼了。
希望本篇小记对你有帮助吧!