首页 > 试题广场 >

以下 JavaScript 代码,在浏览器中运行的结果是

[单选题]

以下 JavaScript 代码,在浏览器中运行的结果是

function foo(){
    console.log('first');
    setTimeout(function (){
        console.log('second');
    },5);
}
for(var i=0;i< 4399999999;i++) {
    foo();
}


  • first,second,first,second..依次顺序输出
  • 首先全部输出first,然后全部输出second
  • first,second无顺序输出
  • 首先输出first,超出5ms输出所有second,最后输出余下的first
B:首先js 是运行于单线程环境中,定时器作用是在规定时间内将事件加入执行队列,而加入的前提是当前事件队列没有任何东西
发表于 2016-12-28 22:39:27 回复(3)
JavaScript 是单线程的,setTimeout 设置的是异步任务,会放在 macrotask 里面,等待执行栈的代码执行完毕之后才会执行 macrotask 里面的异步任务,所以这里会等待 for 循环执行完毕才会执行定时器设置的任务。
发表于 2017-09-24 14:48:37 回复(3)
答案是B。

这里考察的知识点是回调的运行机制。
回调时,被回调的函数会被放在event loop里,等待线程里的任务执行完后才执行event loop里的代码。
因此,上述代码会先把线程里的console.log('first')执行完后,再执行event loop里的console.log('second')。

因此,答案选B。
编辑于 2016-12-31 16:44:15 回复(2)

当我们调用一个方法的时候,js会生成一个与这个方法对应的执行环境(context),又叫执行上下文。这个执行环境中存在着这个方法的私有作用域,上层作用域的指向,方法的参数,这个作用域中定义的变量以及这个作用域的this对象。 而当一系列方法被依次调用的时候,因为js是单线程的,同一时间只能执行一个方法,于是这些方法被排队在一个单独的地方。这个地方被称为执行栈。

当一个脚本第一次执行的时候,js引擎会解析这段代码,并将其中的同步代码按照执行顺序加入执行栈中,然后从头开始执行。如果当前执行的是一个方法,那么js会向执行栈中添加这个方法的执行环境,然后进入这个执行环境继续执行其中的代码。当这个执行环境中的代码 执行完毕并返回结果后,js会退出这个执行环境并把这个执行环境销毁,回到上一个方法的执行环境。这个过程反复进行,直到执行栈中的代码全部执行完毕。

以上的过程说的都是同步代码的执行。那么当一个异步代码(如发送ajax请求数据)执行后会如何呢?前文提过,js的另一大特点是非阻塞,实现这一点的关键在于下面要说的这项机制——事件队列(Task Queue)。

js引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈中的其他任务。当一个异步事件返回结果后,js会将这个事件加入与当前执行栈不同的另一个队列,我们称之为事件队列。被放入事件队列不会立刻执行其回调,而是等待当前执行栈中的所有任务都执行完毕, 主线程处于闲置状态时,主线程会去查找事件队列是否有任务。如果有,那么主线程会从中取出排在第一位的事件,并把这个事件对应的回调放入执行栈中,然后执行其中的同步代码...,如此反复,这样就形成了一个无限的循环。这就是这个过程被称为“事件循环(Event Loop)”的原因。
发表于 2018-10-01 11:11:08 回复(1)
答案为b因为js中setTimeout是在规定时间后把时间加入队列,但必须是前边事件队列里无任务,否则会优先执行队列里的任务
发表于 2017-02-26 12:17:32 回复(0)

js 的运行环境为单线程,定时器setTimeout是在规定时间后把时间加入队列,但必须是前边事件队列里无任务,否则会优先执行队列里的任务。
如:

function foo() {
    console.log('first');
    setTimeout(function() {
      console.log('second');
    },5)}
for(var i=0; i<100; i++) {foo()}
//会输出200个值,前100个为“first”,后100个为“second”;
发表于 2018-03-15 09:07:58 回复(0)
可参考:http://www.ruanyifeng.com/blog/2014/10/event-loop.html
发表于 2017-02-13 21:30:15 回复(0)
 

JS单线程,而 setTimeout 是异步执行, 解释器会先执行后面的代码,然后再去执行定时器那块代码
发表于 2017-08-05 22:00:05 回复(1)
先执行同步代码,再事件循环异步代码
发表于 2021-08-19 08:58:24 回复(0)
先执行宏任务,再执行微任务
发表于 2018-06-01 09:26:26 回复(0)
B js的事件队列?
发表于 2016-12-15 00:35:55 回复(0)
setTimeout是异步任务,要等待指定时间后再放入异步任务队列,然后再等待同步任务全部执行完之后再执行。
发表于 2021-08-16 16:21:51 回复(0)
想请问一下,既然是等同步任务执行结束,应该一直输出first,first会在这个for循环中执行完吗?
发表于 2023-04-26 15:16:43 回复(0)
即使延时时间变为0,也是同样的输出
发表于 2022-04-05 10:55:35 回复(0)
setimeout是异步的
发表于 2021-11-12 00:57:05 回复(0)
js是单线程的,定时器作用是在规定时间内将事件加入执行队列,需要等带for语句执行完成后再执行定时器的任务
发表于 2021-05-10 11:28:12 回复(0)
这不直接死机?
发表于 2021-04-22 23:18:13 回复(0)
我以为这道题考察的是大括号没有闭合。。。
发表于 2021-03-29 14:49:44 回复(1)
因为js是单线程执行,而setTimeout函数是异步任务,异步任务必须要等到同步任务执行完毕才能继续执。所以先全部输出first,再全部输出second
发表于 2021-02-27 17:46:35 回复(0)
同步异步,异步提取出来最后执行
发表于 2021-01-23 21:59:35 回复(0)