javascript 单线程之一

初次接触到javascript的单线程。


 1     <button id="do">计算器</button>
2 <div id="status"></div>
3
4 <script type="text/javascript">
5 var $=function(id){
6 return document.getElementById(id);
7 };
8
9 $(‘do‘).onclick=function(){
10 $(‘status‘).innerHTML="正在计算.........."; //这里根本就没有去做 ??
11 long();
12 };
13
14 var long=function(){
15 var result=0;
16 for(var i=0; i< 1000; i++){
17 for(var j=0; j<1000; j++){
18 for(var k=0; k<1000; k++){
19 result+=i+j+k;
20 }
21 }
22 }
23 $(‘status‘).innerHTML=‘计算完成‘;
24 };
25
26
27 </script>

测试结果是:正在计算这几个字根本就没显示,直接显示计算完成。

后来分析原因,当点击事件发生时,浏览器事件触发线程
向Event Loop 中添加了点击事件,javascript引擎线程
在处理完点击事件后,继续执行下边的

long()函数,直到 javascript引擎线程
执行完函数后,界面渲染线程
才有机会执行界面重绘,结果就是N秒之后,才显示“计算完成”。

javascript 单线程之一,布布扣,bubuko.com

时间: 2024-11-06 18:02:53

javascript 单线程之一的相关文章

JavaScript单线程和异步机制

随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时是单线程的.嗯,就这么点印象.当时也有些疑问:既然是单线程的,那异步调用是怎么实现的?计时器是靠谁来计时的,这单线程总不能一边执行程序一边计时吧?那些耗时的I/O操作为啥没把线程阻塞,不是说好的单线程么?相信很多不了解JavaScript单线程的同学也有过类似的疑问. 今天看了不少相关的资料,就详细

浏览器中Javascript单线程分析

线程这个特性对于一门语言环境来说是尤其重要的,在Java/C++环境下都提供了多线程API操作. 但在Javascript中据说代码执行时单线程的,大量计算的逻辑会阻塞浏览器HTML渲染,但setTimeout延时处理.XHR的异步请求是如何实现的, 接下来我们将逐一分析. 首先需要肯定的是浏览器中Javascript确实是单线程执行的,不信我们可以看个例子. <html> <head></head> <body> <script>setTime

细说JavaScript单线程的一些事

最近被同学问道 JavaScript 单线程的一些事,我竟回答不上.好吧,感觉自己的 JavaScript 白学了.下面是我这几天整理的一些关于 JavaScript 单线程的一些事. 首先,说下为什么 JavaScript 是单线程? 总所周知,JavaScript是以单线程的方式运行的.说到线程就自然联想到进程.那它们有什么联系呢? 进程和线程都是操作系统的概念.进程是应用程序的执行实例,每一个进程都是由私有的虚拟地址空间.代码.数据和其它系统资源所组成:进程在运行过程中能够申请创建和使用系

深入理解Javascript单线程谈Event Loop

假如面试回答js的运行机制时,你可能说出这么一段话:"Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件."但你能说出背后的原因吗? 1.线程与进程 进程:是系统资源分配和调度的单元.一个运行着的程序就对应了一个进程.一个进程包括了运行中的程序和程序所使用到的内存和系统资源. 线程:线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程. 2.同步和异

JavaScript单线程的疑问与解答

问: JavaScript是单线程的,有任务队列,比如使用setTimeou(func,secs)来在secs毫秒后向任务队列添加func.但是,setTimeout后面跟一个死循环,那么死循环导致任务被阻塞,也就是说func不能执行. 我想请教一下:死循环在执行的时候,secs毫秒过去的时候,func是否被添加到任务队列中?如果添加了,但JS是单线程的,不是在这个线程中添加的,那在哪里被添加的?求大神解答下,找乐很多东西,都是和JavaScript高级程序设计上的说法一样. 答: 原因是 JS

从Javascript单线程谈Event Loop

假如面试回答js的运行机制时,你可能说出这么一段话:"Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件."但你能说出背后的原因吗? 先理解相关概念 线程与进程 进程:是系统资源分配和调度的单元.一个运行着的程序就对应了一个进程.一个进程包括了运行中的程序和程序所使用到的内存和系统资源. 线程:线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程.

Javascript单线程实现

对于Javascript的单线程实现一直一知半解的.开始以为很难,但是仔细看一下感觉还好. 首先明白一点,js是单线程的,也就是说js只能在同一时刻处理一段代码.但是js运行的环境浏览器却是可以多线程的,它具有多个线程,js代码处理引擎线程.事件触发线程.http请求线程.计时器触发线程.多者辅助,实现了js的异步处理. 准确的来说.这个实际上就是说,js引擎线程就是主程序.一旦碰上相应的例如计时器产生了,就先将这个定时器内部的代码先挂起,等到需要执行的时间到了,让计时器的线程提醒js该执行刚刚

JavaScript单线程

首先浏览器的js引擎是单线程的,执行一个耗时操作必定阻碍线程后续代码的执行(比如等待网络请求的响应).一些语言采用了开一个子线程并把耗时操作放到子线程去执行的办法解决了这个问题.js引擎本身不支持多线程,但是浏览器基本上都有三个线程:js引擎线程.事件触发线程.http请求线程.后两个线程在触发后会把对应的回调函数放到js引擎线程的执行队列中进行排队等待,只要js引擎线程空闲就会依次执行加入到队列中的回调函数.当然这些回调函数的执行依然是阻碍线程的. 引用:https://segmentfaul

JavaScript引擎是单线程的

从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下下面三个函数是如何控制计时器的. 1 var int = self.setInterval("updateMsg()",12000); var id = setTimeout(fn, delay); -- 初始化一个计时器,然后在指定的时间间隔后执行.该函数返回一个唯一的标志ID(Number类型),我们可以使用它