JavaScript 执行块和消息队列
JavaScript execution blocks and the message queue
是否可以在循环执行块之后调用延迟为 0ms setTimeout(function, 0)
的超时函数,或者包含函数块 总是 首先完成?
setTimeout(function(){ //something in here }, 0);
function myFunction() {
// do something
// loop block
// could timeout = 0 be scheduled to execute here?
// do more things
}
myFunction()
在我的上下文中 (Angular 2),了解 Angular 的 ApplicationRef.tick()
来检查 data-binding/component 更改是否可能是很有趣的在我完成嵌套循环内的双向绑定操作之前调用 属性?
函数调用和所有后续子函数调用是否等同于消息队列中的单个项目,或者是否分解为每个执行块都是消息队列中的单个项目?因此 setTimeout(..., 0)
可能进入队列中的执行块之间?
不,这是不可能的。您可以将 javaScript 视为 "one thread" - 在任何时间点都只有一个代码和平 运行。任何超时都将在当前流程结束后执行。
此外,在执行时 javascript 页面变得无响应——您无法执行任何操作。
一些演示:
setTimeout(function() { console.log(1) });
var d = new Date();
var i = 0; for(; i < 1e9; i++) {}
console.log(i);
console.log('Passed ' + (new Date() - d));
>> 1000000000
>> Passed ~2000
>> 1
是否可以在循环执行块之后调用延迟为 0ms setTimeout(function, 0)
的超时函数,或者包含函数块 总是 首先完成?
setTimeout(function(){ //something in here }, 0);
function myFunction() {
// do something
// loop block
// could timeout = 0 be scheduled to execute here?
// do more things
}
myFunction()
在我的上下文中 (Angular 2),了解 Angular 的 ApplicationRef.tick()
来检查 data-binding/component 更改是否可能是很有趣的在我完成嵌套循环内的双向绑定操作之前调用 属性?
函数调用和所有后续子函数调用是否等同于消息队列中的单个项目,或者是否分解为每个执行块都是消息队列中的单个项目?因此 setTimeout(..., 0)
可能进入队列中的执行块之间?
不,这是不可能的。您可以将 javaScript 视为 "one thread" - 在任何时间点都只有一个代码和平 运行。任何超时都将在当前流程结束后执行。 此外,在执行时 javascript 页面变得无响应——您无法执行任何操作。
一些演示:
setTimeout(function() { console.log(1) });
var d = new Date();
var i = 0; for(; i < 1e9; i++) {}
console.log(i);
console.log('Passed ' + (new Date() - d));
>> 1000000000
>> Passed ~2000
>> 1