gistfile1.txt 下面这一段代码,是前端开发招聘笔试中经常出现的,目的是考察闭包以及setTimeout的运行机制。for(var i = 0; i 10; i++){setTimeout(function(){console.log(i);},0);}首先要了解setTimeout的运行
下面这一段代码,是前端开发招聘笔试中经常出现的,目的是考察闭包以及setTimeout的运行机制。 for(var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },0); } 首先要了解setTimeout的运行机制,他是要等到所有可执行的代码运行完毕以后再执行,所以不管后面的duration是多少,都要等到for循环结束才运行,此时i作为一个全局变量的值为10,因此控制台会打印10个10。 要解决这个问题,有以下几个方案: 一是使用闭包,改变setTimeout的环境变量。 for(var i = 0; i < 10; i++){ f(i); } function f(index){ setTimeout(function(){ console.log(index); },0); } 二是使用bind(),即当需要运行次函数时,将合适的参数传进去。 for(var i = 0; i < 10; i++){ setTimeout(function(index){ console.log(index); }.bind(this,i),0); } 三是使用ES6的新定义变量方法let。 for(let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },0); } 最后运行的结果就是0到9十个数字。