代码一:for(vari=1;i<=5;i++){setTimeout(functiontimer(){console.log(i);},i*1000);}通常情况下,我们对这段代码行为的期望是分别输出1到5的数字,每秒输出一次,一次输出一个。但实际上,运行时,这段代码会打印6五次,每秒一次。代码2:for(vari=1;i<=5;i++){(function(){setTimeout(functiontimer(){console.log(i);},i*1000);})();}结果又是:以每秒一个的速度输出6五次。代码3:for(vari=1;i<=5;i++){(function(){varj=i;setTimeout(functiontimer(){console.log(j);},j*1000);})();}结果正常:分别输出数字1~5,每秒一次,每次一个码4(改进):for(vari=1;i<=5;i++){(function(j){setTimeout(functiontimer(){console.log(j);},j*1000);})(i);}代码4(改进):for(vari=1;i<=5;i++){letj=i;//是的,闭包的块作用域!setTimeout(functiontimer(){console.log(j);},j*1000);}代码5(改进):for(leti=1;i<=5;i++){setTimeout(functiontimer(){console.log(i);},i*1000);}说明:let语句可以用来劫持块作用域,并在这个块作用域中声明一个变量。块作用域与闭包的结合,可以天下无敌知识来源:《你不知道的JavaScript(上卷)》,5.4循环与闭包
