js中的闭包
目录
一、闭包
二、常见问题
1.for循环+var的输出
三、解决方案
1.修改为let声明
2.使用立即执行函数
一、闭包
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);}