概述
1.for (var i=1;i<4;i++){
setTimeout(function (){console.log(i);} ,10 )
}
答案及解析:这道题涉及了异步、作用域、闭包setTimeout( ) 是属于 window 的 method,是异步执行函数,这里是10ms后执行,仅仅执行一次。
js执行机制是:判断JS是同步还是异步,同步进入主线程,异步进入Event table,其次,异步任务在Event table(事件表)中注册函数,当满足特定的条件,被推入Event queue(事件队列),最后,同步任务进入主线程后一直执行,直到主线程空闲后,才会去Event queue中查看是否有可执行的异步任务,如果有就推入主线程中执行。
先执行for循环,这个循环的运行结果是i不再小于4,条件首次成立时i=4,因此输出结果为循环结束时i的最终值,同步执行函数执行完之后i=4,每一次for循环的时候,settimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了3次,就放了3次,也就是说任务队列里有三个function,需要执行三次console.log(i),而此时
i=4,因此最后输出结果为4 4 4。
补充:如果程序改为
for (let i=1;i<4;i++){
setTimeout(function (){console.log(i);} ,10 )
}
则输出结果:1 2 3 。因为ES6中的let声明会劫持块级作用域,for循环的let声明会在每次迭代时进行变量声明,随后每个迭代都会用上一次循环结束的值来初始化i,这样迭代的结果就是1,2,3了。
(注:我运行这段程序用的是webstorm,Node.js使用V8引擎,而V8引擎对ES6中的东西有部分支持,正常模式下会报错,因此在Node.js中使用还必须使用harmony模式(和谐模式))
2.
最后
以上就是纯情玉米为你收集整理的一些前端笔试经常会遇到的考程序输出的题(持续更新)的全部内容,希望文章能够帮你解决一些前端笔试经常会遇到的考程序输出的题(持续更新)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复