JavaScript单线程/浏览器事件驱动

首先看一个例子:

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

结果是先输出10000个first然后立即输出10000个second。

因为JavaScript是单线程运行的,特定的时间只能有特定的代码正在执行,不会有多段代码同时执行。

setTimeout一般文档中的描述是一段时间后执行某段代码或者方法,但是严格说来不是的,应该是一段时间后把某段代码或者方法放入执行队列中,至于什么时候能执行它们就只能等JavaScript引擎按照队列一个一个进行。

上面的例子,setTimeout中的方法只能等待for循环结束后才执行,因为for循环在执行队列中靠前。


但是浏览器却不是单线程的,一个浏览器可能有以下进程:javascript引擎线程、界面渲染线程、浏览器事件触发线程、Http请求线程。而且浏览器依靠事件驱动机制来确定代码的执行队列。

所以就不难理解为什么AJAX是异步操作的了。

由于JavaScript是单线程的,所以尽管浏览器可以并行下载js文件,但是也必须依次顺序下载。

实现非阻塞的js文件下载有两种方法:

1. HTML5的defer和async。

<script type="text/javascript" defer src="foo.js"></script>
<script type="text/javascript" async src="foo.js"></script>

2. 动态加载js文件

var script=document.createElement('script');
script.setAttribute("type","text/javascript");
script.setAttribute("src","xxx.js");
document.documentElement.appendChild(script);
//or: document.getElementsByTagName('head')[0].appendChild(script);
//or: document.body.appendChild(script);



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值