闭包
闭包的形成条件
函数嵌套
内部函数引用外部函数的局部变量
闭包的缺点
容易造成内存泄漏 (现代浏览器性能???)
闭包的优点
延长外部函数局部变量的生命周期
什么是闭包
密闭的容器 存储数据
闭包是一个对象 键值对
case1
function outer() {
var a = 123;
function inner() {
console.log(a);
}
return inner;
}
foo()(); //123
又上述代码可知
闭包延长了变量 a 的生命周期 让外部作用域有能力获取到函数内部的变量
闭包就是将函数内部和函数外部连接起来的一座桥梁
case2
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i);
}, 1000);
}
上述代码想实现 每秒输出一个数字 从 1 - 5
但是事实上每秒输出一个 6
因为 setTimeout 是异步队列 执行时 for 循环里 i 的值已经变成了出循环的值
解决方法
for (var i = 1; i <= 5; i++) {
(function fn(i) {
setTimeout(function timer() {
console.log(i);
}, 1000);
})(i);
}
因为函数是一个独立的作用域 可以记录每一个 i 的值 拿到属于自己的 a
Last updated
Was this helpful?