一些前端笔试经常会遇到的考程序输出的题(持续更新)

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.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值