首页 > 试题广场 >

以下代码执行后,console 输出的信息是?for(var

[单选题]
以下代码执行后,console 输出的信息是?
for(var i = 0; i < 5; i++){
    requestAnimationFrame(() => console.log(i));
}


  • 1 2 3 4 5
  • 0 1 2 3 4
  • 4 4 4 4 4
  • 5 5 5 5 5
requestAnimationFrame并非同步执行的,具体可查阅其实现细节,所以for循环中的requestAnimationFrame会在循环退出的时候才执行其中的回调,注意循环退出的时候 i 的值为 5.
发表于 2019-08-25 17:39:58 回复(14)
更应该注意var和let,换成let输出的就是b选项。var时是函数作用域,异步函数在for循环结束后还未执行,函数作用域的i变成了5。let执行时,因为块级作用域的缘故,每一次for循环都会产生一个块级作用域
编辑于 2020-07-14 11:23:57 回复(0)
因为request是异步,所以for循环先执行完成(此时i=5)再执行request,
发表于 2020-05-28 17:08:44 回复(0)
window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。当你准备更新动画时你应该调用此方法。这将使浏览器在下一次重绘之前调用你传入给该方法的动画函数(即你的回调函数)。回调函数执行次数通常是每秒60次,但在大多数遵循W3C建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配。为了提高性能和电池寿命,因此在大多数浏览器里,当requestAnimationFrame() 运行在后台标签页或者隐藏的<iframe> 里时,requestAnimationFrame() 会被暂停调用以提升性能和电池寿命。
发表于 2020-10-15 19:48:47 回复(0)
首先requestanimation是异步执行,等for循环结束后才会进入执行栈。for循环结束时i=5,且requestanimation形成闭包,所以i并未被回收,因此返回55555。考点:1.JS事件循环 2.闭包
发表于 2021-05-31 14:43:07 回复(0)
  • var 声明的变量没有块级作用域,循环变量 i 泄露为全局变量,循环结束后 i 的值为 5
  • requestAnimationFrame() 执行时,会将回调函数添加到异步队列,待主线程中的同步代码执行完成后,才会执行异步队列中的异步任务,此时 for 循环已经结束,console.log() 输出的 i 的值为 5
发表于 2022-07-17 23:41:34 回复(0)
requestAnimationFrame是浏览器定时循环操作的一个接口,不是同步操作,for循环执行完后才会执行它的callback
发表于 2020-06-17 15:33:46 回复(0)
主要考察点:
1、requestAnimationFrame()为异步方***在任务队列中添加任务,当同步代码在主线程中执行完成后会执行任务队中的任务;
2、let与var定义的作用域的不同,let为块级作用域,var为全局作用域,当循环退出时i为5,因此全局中的i均变成5 
发表于 2022-03-01 12:23:14 回复(0)
requestAnimationFrame并非同步执行的,具体可查阅其实现细节,所以for循环中的requestAnimationFrame会在循环退出的时候才执行其中的回调,注意循环退出的时候 i 的值为 5.
发表于 2021-07-25 16:08:38 回复(0)
<p>request是异步执行的,与settimeout类似。for循环是同步代码,先执行它。当for循环6次结束时,I等于5。由于I是var,没有块级作用域。for循环结束后还能访问到,所以输出5个5</p>
发表于 2020-10-29 19:36:14 回复(0)
var和let的区别
发表于 2020-07-29 19:14:43 回复(0)
考察知识点:事件循环。 为什么会打印5次呢,是因为requestAnimationFrame()函数被调用了5次,每一次执行这个函数,就会向 "任务队列" 添加一个回调函数。 主线程结束后,即for循环结束后,js就会去读取任务队列,也就是执行回调函数,打印输出i。 那么为什么是5?因为,for循环退出的条件是i<5呀, i=0,1,2,3,4时都会执行for{}中的内容,最后一次,即i=4时,执行完for{}中的内容后,会执行i++, 即4+1=5,随后判断i<5,此时不符合循环条件。退出循环。所以最终i就等于5。 主线程结束,就可以开始执行任务队列中的回调啦。
发表于 2023-10-16 13:24:10 回复(0)
1
发表于 2023-08-23 23:11:31 回复(0)
1
发表于 2022-04-20 21:27:22 回复(0)

相关知识点:词法作用域、异步

1、requestAnimationFrame是异步的(宏任务)

2、var声明的变量只有函数作用域、全局作用域,没有块级作用域。

3、for循环中的requestAnimationFrame会在循环退出时才执行其中的回调,循环退出时函数作用域的i 的值为 5

发表于 2021-11-11 10:37:39 回复(0)
request是异步所以i=5
发表于 2021-07-21 00:29:13 回复(0)
request是异步执行,等跳出循环是i为5,若换为let每次for 循环会产生块级作用域.打印为01234
发表于 2021-02-17 23:17:44 回复(0)