`
nicegege
  • 浏览: 589526 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

js单线程问题

 
阅读更多

最近想做一个东西,大概是这样的。浏览器的滚动条在body头部和底部之间自动移动。移动的过程有速度效果,从慢到快的。也叫加速度效果。

核心代码:

               

var height=$("body").height();//height=2000
while(height>0){
     var temp=200;
     height-=temp;
     if(height>0){
     }else{
          height=0;
     }
     //线程休息2秒
     setTimeout(function(){
          alert(height);
          $("body").scrollTop(height);
     },20000);
}
 

 

 代码运行结果。弹出十个alert,结果均为0。第一次alert后,滚动条会滑动到body头部。

这个和我预想的每个2秒,滚动条从底部向头部移动200像素。结果完全不一样。

看一道js面试题:

<script type="text/javascript">
var t=true;
window.setTimeout(function(){
t=false;
},1000);
while(t){

}
alert('end');
</script>

 运行结果是一直空白,不执行alert弹出框。

上面的种种疑惑的谜底是:

js是单线程的,setTimeout是异步的。js先执行同步代码,执行完后执行异步代码。

在上面面试题中,先执行while(){},由于while是一个死循环所以一直执行,js没有空闲处理异步。所以不会出现alert弹出框。

再解释我做的demo的问题,js先执行while循环,循环结束以后height会变成0,每次循环会执行一次setTimeout异步事件。由于while循环时,js没有空闲处理异步事件所以10次事件会放在js的事件队列中,等待被执行。循环结束以后,js空闲,会执行js事件队列中的事件。执行十次。

 

扩展:

JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序

一、浏览器的内核是多线程的,它们在内核制控下相互配合以保持同步,一个浏览器至少实现三个常驻线程:javascript引擎线程,GUI渲染线程,浏览器事件触发线程。

1. javascript引擎是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JS线程在运行JS程序。

2. GUI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。但需要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。

3. 事件触发线程,当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其他线程如鼠标点击、AJAX异步请求等,但由于JS的单线程关系所有这些事件都得排队等待JS引擎处理。(当线程中没有执行任何同步代码的前提下才会执行异步代码)

4.setTimeout(fn, 500)执行可能比我们自己计划的时间慢,原因是js是单线程,异步代码在同步代码执行完毕的情况下,才会去执行。所以可能有时间延迟。异步代码等待执行的过程中有同步代码要执行,则同步代码先执行。

 

浏览器内核实现原理:

浏览器内核实现允许多个线程异步执行,这些线程在内核的控制下相互配合以确保同步。假如一个浏览器内核的实现至少有三个常驻线程:javascript引擎线程,界面渲染线程,浏览器事件触发线程。除此之外,也有一些执行完成就终止的线程。如http请求线程,这些异步线程会产生不同的异步事件,下面有一个图说明,js引擎和其他线程怎么相互通信的,虽然每个浏览器内核实现细节不同,但是调用原理大同小异。

浏览器执行事件

浏览器内核、js引擎与其他线程通信

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    JavaScript单线程还是多线程

    它的核心特性之一是单线程(Single-Threaded),这也是JavaScript设计时的重要考量,以确保代码执行的简单性和一致性。本文将深入探讨JavaScript的单线程模型以及与之相关的并发机制。 在计算机编程中,线程是程序...

    解决js单线程的njs库

    而“njs库”就是针对JavaScript单线程问题的一个解决方案。 njs(Nginx JavaScript)是Nginx公司推出的一个模块,允许在Nginx服务器配置中直接嵌入JavaScript代码,目的是扩展Nginx的功能和提升其灵活性。由于Nginx...

    单线程与多线程的区别

    单线程和多线程是计算机程序执行时的两种不同模型,它们在处理并发任务、资源管理和性能上有着显著的差异。理解这两种模型是编程尤其是服务器端开发的基础,尤其是在Java、C#等支持多线程的编程语言中。 首先,让...

    Javascript定时器 一 单线程

    本篇文章将深入探讨JavaScript定时器的工作原理以及它们在单线程环境中的行为。 ### 一、JavaScript的单线程模型 JavaScript是一种解释型的、基于原型的、动态类型的脚本语言,它的执行环境主要是Web浏览器中的...

    JavaScript的单线程与多线程:深入理解与应用实践

    本文将深入探讨JavaScript的单线程和多线程概念,解释它们如何影响程序的执行,以及如何在实际开发中利用这些特性。 JavaScript的单线程和多线程模型各有优势和挑战。开发者需要根据应用的具体需求,合理选择并发...

    详细分析单线程JS执行问题

    大家在学习javascript的时候很多朋友在执行问题上有疑惑,小编通过本篇文章给大家详细的分析介绍了JS的执行问题,希望能够帮助到你理解。 一、介绍 随着js不断学习,你可能会慢慢的好奇,用了这么久的js,却不知道这...

    javascript模拟多线程

    JavaScript,作为一种广泛应用于Web开发的脚本语言,一直以来都是单线程执行的。然而,在处理复杂的计算任务或者大型数据操作时,单线程的模式可能会导致浏览器变得卡顿,用户体验下降。为了解决这个问题,开发者们...

    Javascript定时器 一 单线程 修正

    在这个主题中,我们将深入探讨JavaScript中的定时器机制,特别是与单线程环境相关的方面。 首先,JavaScript是一种解释型、基于原型的、弱类型的脚本语言,其在浏览器环境中运行时,遵循一种称为“事件循环”...

    浅谈Javascript单线程和事件循环.doc

    JavaScript是一种单线程编程语言,这意味着它在任何时刻只能执行一个任务。这一设计背后的考虑是为了保持DOM操作的稳定性。在多线程环境中,对同一元素的并发操作可能导致数据不一致和不可预测的结果,例如上面提到...

    开启大前端的大门JS 为什么是单线程.zip

    这是由一些与用户的互动以及操作 DOM 等相关的操作决定了 JS 要使用单线程,否则使用多线程会带来 复杂的同步问题。如果是多线程,一个线程正在修改 DOM,另一个线程正在删除 DOM,那么以哪一 个为准呢?

    单线程进度条程序,可以方便的添加到你的工程中

    本项目提供了一个单线程的进度条程序,适用于那些需要显示执行过程的软件工程。这个程序的核心是通过定时器来控制进度条的更新,以实现动态显示的效果。 首先,我们要理解单线程的概念。在计算机编程中,一个线程是...

    理解javascript定时器中的单线程

    总之,理解JavaScript定时器中的单线程对于JavaScript编程非常重要,它不仅帮助开发者编写出更加高效、性能更加优越的代码,同时还能更好地理解浏览器的工作机制,避免诸如页面假死等问题的出现。

    js单线程的本质 Event Loop解析.docx

    ### JavaScript 单线程的本质与 Event Loop 解析 #### 一、JavaScript 单线程机制简介 JavaScript 是一种广泛应用于 Web 开发的语言,其最大的特点之一便是采用了**单线程模型**。这意味着在任何时间点,...

    JavaScript多线程的实现方法(gif).txt

    虽然原生JavaScript是基于事件循环的单线程语言,但可以通过一些技巧来模拟多线程的效果,例如利用`setTimeout`或`setInterval`等异步机制。本文将介绍一种通过利用GIF图像加载事件来模拟多线程的方法。 #### GIF ...

    js多线程--很好用的东东

    JavaScript,作为Web开发中的主要脚本语言,一直以来都是单线程执行的,这意味着它在同一时间只能处理一个任务。然而,随着Web应用复杂性的增加,尤其是处理大量数据或进行复杂的计算时,单线程模型可能会导致浏览器...

    线程之舞:JavaScript的单线程与非阻塞I/O揭秘

    ### 线程之舞:JavaScript的单线程与非阻塞I/O揭秘 #### JavaScript简介及主要特点 JavaScript(通常简称为JS)是一种高级、解释型的编程语言,广泛应用于构建交互式的Web应用程序。随着时间的推移,JavaScript已...

    04_JS是单线程的.html

    04_JS是单线程的.html

    深入浅析Node.js单线程模型

    Node.js采用 事件驱动 和 异步I/O 的方式,实现了一个单线程、高并发的运行时环境,而单线程就意味着同一时间只能做一件事,那么Node.js如何利用单线程来实现高并发和...本文将围绕这个问题来探讨Node.js的单线程模型

    JavaScript单线程和任务队列原理解析

    由于多线程操作DOM可能导致复杂的同步问题,JavaScript被设计为单线程,以简化编程逻辑。然而,为了充分利用多核处理器的能力,HTML5引入了Web Worker,但这并未改变JavaScript的单线程本质,因为Web Worker仍然受限...

Global site tag (gtag.js) - Google Analytics