背景知识1. 涉及到let和var的作用域范围 let的作用域为块级,直观的看就是 {}内,出了大括号这个变量就失效了。 var的作用域为定义这个变量的函数内,如果不在函数内,他就是全局的了。 背景知识2. setTimeout为异步执行,当同步代码全部完成后,才会去执行它,本例中for循环跑完后才会依次执行各个setTimeout里的function。 过程推演: 两个for循环各创建了4个 setTimeout,他们中都被传入了变量i,等待for循环结束后开始执行。 基于背景知识1:var-for 传入的4个i在for循环结束后,所有的i都在后续循环时被重新赋值,直至最后一次,赋值为4.let-for 传入的4个i在{}内互不影响,后序循环不会给前面一次的循环体内的i重新赋值(因为每次循环都是独立的{}作用域),故能正常输出期望值
背景知识1. 涉及到let和var的作用域范围
背景知识2. setTimeout为异步执行,当同步代码全部完成后,才会去执行它,本例中for循环跑完后才会依次执行各个setTimeout里的function。
过程推演:
let-for 传入的4个i在{}内互不影响,后序循环不会给前面一次的循环体内的i重新赋值(因为每次循环都是独立的{}作用域),故能正常输出期望值