js中的闭包

一、闭包

闭包就是一个函数可以持续访问外部作用域(非全局作用域)中的变量,即使外层函数已经执行完毕。


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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值