settimeout(function(){console.log(i)},0);

for(var i=0;i<10;++i){
setTimeout(function(){console.log(i)},0);
}
这是一个闭包,那么这个闭包输出的到底是什么???

答案:输出的是 10 ,且连续输出10次;

setTimeout是异步执行,也即每一次for循环执行一次,settimeout都会执行一次,但是里面的settimeout并没有立即被执行,而是等到for循环结束,再执行;for循环了10次,就放了10次,当主线程执行完成后,才进入任务队列里面执行。

那么如果我想将这个闭包输出0,1,2,3,4,5,6,7,8,9怎么办?

答案:将var 改为 let (es6定义);

因为for循环头部的let不仅将i绑定到for循环快中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 function就能使用 i 这个变量了;这个匿名函数的参数作用域 和 for参数的作用域 不一样,是利用了这一点来完成的。这个匿名函数的作用域有点类似类的属性,是可以被内层方法使用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章