持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
铃铛说点题外话
一句话前情回顾:闭包的第三种形式:定时器、时间监听等回调函数
一句话介绍今天:如何解决上节课立即执行函数造成的情况
铃铛说正文
针对上一篇立即执行函数造成的问题,接下来我会用几种方法来解决
- 利用立即执行函数表达式当每次for循环时,把此时的i变量传递到定时器中
for(var i = 1;i <= 5;i++){
(function(j){
setTimeout(function timer(){
console.log(j)
}, 0)
})(i)
}
- 给定时器传入第三个参数, 作为
timer函数的第一个函数参数
for(var i=1;i<=5;i++){
setTimeout(function timer(j){
console.log(j)
}, 0, i)
}
- 使用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的变量值返回
最后我们对闭包进行一个新的总结:
- (红宝书):闭包是指有权访问另外一个函数作用域中的变量的函数
- 闭包是指那些能够访问自由变量的函数。
跟铃铛说再见
学习的最后一步:放松
今日冷笑话:有一对玉米相爱了,于是它们决定结婚,结婚那天,一个玉米找不到另一个玉米了,这个玉米就问身旁的爆米花:你看到我们家玉米了吗? 爆米花:亲爱的,人家穿婚纱了嘛。
放松结束,猜猜明天会说讲些什么吧