JS面试知识点4-闭包

闭包:

  • 结合面试回答的时候:

    • 项目中是否用到,用到有什么两点。
  • 理解:正常情况下,作用域只会单独出现,要么全局作用域,要么函数作用域,但是两个函数嵌套形成了作用域的交叉,所以出现了闭包的概念。

函数A中有一个函数B,函数B能够访问到函数A的变量,函数B就是闭包。
概念上就是:闭包就是能够访问另一个函数作用域变量的函数。
在JS中函数中,定义一个函数,函数内查找变量只能在自身函数作用域找,找不到则到window中查找。
但是闭包的函数是可以访问到另一个函数作用域中的变量。

闭包存在的意义:
能够访问到函数内部的变量

for (var i = 1; i <= 5;i++){
    setTimeout(
      function timer(){console.log(i)},
      i * 1000
  )
}

因为setTimerout是异步的,所以for循环会先执行完毕,i为6,所以输入一堆6;

如果修改函数让其依次输出

方法1:let+作用域

for (let i = 1; i <= 5; i++) {
    setTimeout(() => {
    console.log(i);
    }, i * 1000);
}

方法2: 自调+闭包

for (var i = 1; i <= 5; i++) {
    (function (j) {
    setTimeout(() => {
        console.log(j);
    }, j * 1000);
    })(i);
}

方法3:setTimeout第三个参数

for (var i = 1; i <= 5; i++) {
  setTimeout(
    (i) => {
    console.log(i);
    },
    i * 1000,
    i
);
}
  /* 
      变量i的查找:从for的()中找到了
       */
      var data = [];

      for ( var i = 0; i < 3; i++ )
      {
        data[i] = function () {
          console.log( i );
        };
      }

      data[0]();
      data[1]();
      data[2]();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值