圣诞快乐
开始吧:“读取for循环计数器的值”可谓出现频率较多的一道题。
编码如下:问输出结果???
解答:变量i是var声明,在全局范围内有效,每一次循环i的值都发生变化,循环内异步setTimeout函数内部,console.log(i)中的i没有var定义,指向全局的i,导致运行时输出的是最后一轮i的值。结果就是每隔一秒输出一个6。如何把每次循环的i保存起来得到1,2,3,4,5
由于js是单线程,基于事件循环,非阻塞IO;插播一个知识点:"js执行顺序"
1、js执行顺序:先同步后异步
2、异步中任务队列执行顺序:先微任务队列,再宏任务队列
3、微任务队列:调用Promise中的resolve、reject
4、宏任务队列:setTimeout
解决方式一、
通过立即调用函数(IIFE)和匿名函数形成一个私有作用域(相当于闭包)
这种写法叫:"命名空间" IIFE立即执行函数中的参数i作为私有变量,和每次循环得到的i是两个不同的变量。闭包中私有变量保存在内存中,等for循环执行完,随任务队列输出。
解决方式二、
通过ES6中块级作用域let
循环中的i是let声明的,只在本轮循环中有效,每一次循环的i都是一个新的变量,利用javascript引擎内部会记住上一循环的值,本次循环的初始值通过上一次循环计算。
格局决定一个人的高度和宽度,有格局的人能够运筹帷幄,高瞻远瞩,善于取舍,能屈能伸。