单线程的JavaScript及其工作原理

一、单线程的来源

几乎所有人都已经听过V8引擎的概念,并且很多人知道JavaScript是单线程的,JavaScript作为浏览器脚本语言,它的主要用途是与用户交互,那么为什么JavaScript是单线程呢?如果JavaScript是多线程,当页面更新内容的时候、用户又触发了交互,这时候线程间的同步问题会变得很复杂,为了避免复杂性,故JavaScript被设计成单线程。

二、JavaScript引擎

引擎包括两个组件:

  • 内存堆——进行内存分配的区域

  • 调用栈——代码执行时栈中的位置

三、运行时

 

四、调用栈

fucntion multiply(x,y) {
    return x * y;
}
function printSquare(x) {
    var s = mulitiply(x,x);
    console.log(s);
}
printSquare(s);

当引擎开始执行这段代码的时候,调用栈会被清空,之后产生如下步骤: 

五、堆栈溢出

一旦达到最大调用栈大小的时候发生。这种情况相当容易发生。特别是当你使用递归时;

当调用栈中的函数调用次数超过了调用栈的实际大小,浏览器决定抛出一个错误,如下图所示:

 

六、事件循环(Event Loop)

 

具体包括:

  • Javascript 有一个主线程和执行栈,所有的任务都会被放到调用栈等待主线程执行

  • 同步任务会被放在调用栈中,按照顺序等待主线程依次执行

  • 主线程之外存在一个任务队列,所有任务在主线程中以执行栈的方式运行

  • 同步任务都在主线程上执行,栈中代码在执行的时候会调用 Web API,此时会产生一些异步任务

  • 异步任务会在有了结果(比如被监听的事件发生时)后,将注册的回调函数放入任务队列中

  • 执行栈中任务执行完毕后,此时主线程处于空闲状态,会从任务队列中获取任务进行处理

以上过程会不断重复,这就是浏览器的运行机制,也是Event Loop。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值