一、闭包
function closure() {
let a = 10;
return function () {
return a;
};
}
let fun1 = closure();
//函数可以访问另一个函数的局部变量,即使外层函数已经执行完毕
let number = fun1();//10
二、常见问题
1.for循环+var的输出
因为var没有块级作用域,每次迭代都是同一个变量,五次循环最终的i为5,因为setTimeout为异步任务,等循环结束后,才开始输出,此时会输出5次5
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 0);
}//输出5次5
三、解决方案
1.修改为let声明
let为块级作用域,每次迭代都是不同的变量,所以每次输出的值不同
for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
}, 0);
}//输出0,1,2,3,4
2.使用立即执行函数
for (var i = 0; i < 5; i++) {
//立即执行函数会创建独立作用域
(function (j) {
setTimeout(() => console.log(j), 100); // 输出0,1,2,3,4
})(i);
}