细说JS系列(十九)

127 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

铃铛说点题外话

一句话前情回顾:闭包的第三种形式:定时器、时间监听等回调函数

一句话介绍今天:如何解决上节课立即执行函数造成的情况

铃铛说正文

image.png

针对上一篇立即执行函数造成的问题,接下来我会用几种方法来解决

  1. 利用立即执行函数表达式当每次for循环时,把此时的i变量传递到定时器中
for(var i = 1;i <= 5;i++){
  (function(j){
    setTimeout(function timer(){
      console.log(j)
    }, 0)
  })(i)
}
  1. 给定时器传入第三个参数, 作为timer函数的第一个函数参数
for(var i=1;i<=5;i++){
  setTimeout(function timer(j){
    console.log(j)
  }, 0, i)
}
  1. 使用ES6中的let
for(let i = 1; i <= 5; i++){
  setTimeout(function timer(){
    console.log(i)
  },0)
}

第三种方法是我们日常开发中最常用的一种方法,let是ES6新增的一种定义变量的方式,除了let以外,ES6话新增了一个const定义变量。let和const与var的区别就是,let和const由于暂时性死区的原因,不存在变量提升,这俩也有块级作用域的限制。

闭包最常使用的一种场景

function fn(){
    var name="hello";
    return function(){
        return name;
    }
}
var fnc = fn();
console.log(fnc())//hello

作为函数的返回值,这个例子里面就是使用闭包的形式将name的变量值返回

最后我们对闭包进行一个新的总结:

  • (红宝书):闭包是指有权访问另外一个函数作用域中的变量的函数
  • 闭包是指那些能够访问自由变量的函数。

跟铃铛说再见

学习的最后一步:放松

今日冷笑话:有一对玉米相爱了,于是它们决定结婚,结婚那天,一个玉米找不到另一个玉米了,这个玉米就问身旁的爆米花:你看到我们家玉米了吗?  爆米花:亲爱的,人家穿婚纱了嘛。

放松结束,猜猜明天会说讲些什么吧