首页 新闻 会员 周边

关于JavaScript无阻塞心中的疑问,希望哪位大神能指点指点

0
悬赏园豆:100 [已解决问题] 解决于 2016-05-22 22:22

JavaScript无阻赛加载最常用的就是xhr 注入script dom element,《高性能JavaScript》一书中有提到,倘若我用script dom element技术,将script动态插入head中,文件的下载和运行都不会阻塞其他页面处理过程。这里百思不得其解,通过动态插入head中,JavaScript文件下载不会阻塞其他页面处理过程,但运行肯定会吧?浏览器不是单进程的么,一旦下载成功后立即执行,其他一切操作肯定会等该JavaScript代码执行完后,才进行啊。那为什么还说无阻塞呢。

我的观点:只能说加载无阻赛,但运行肯定会使其他操作挂起,等待完成后再处理。

疑问:JavaScript无阻赛技术为什么可以毫无顾忌地将JavaScript放到head中,且运行时不会阻塞其他页面处理过程?像这样,页面渲染时,在遇到<body>前执行JavaScript,不同样会出现短时间的白屏么?除开下载改善了外,与将<script>标签放到<head>中有什么区别?

猴子猿的主页 猴子猿 | 初学一级 | 园豆:116
提问于:2016-05-08 11:20
< >
分享
最佳答案
0

根据JavaScript的阻塞特性,写了篇博客:http://www.cnblogs.com/giggle/p/5513769.html

猴子猿 | 初学一级 |园豆:116 | 2016-05-22 22:19
其他回答(3)
0

你把它想复杂了,事实上它很简单,动态加载js无非是利用了流量器的多线程技术实现了无阻塞加载,加载成功后,运行效果是一样的。

收获园豆:35
上帝之城 | 园豆:2549 (老鸟四级) | 2016-05-08 12:37

是针对加载而言?就是说加载后,执行时,还是会阻塞哈?但书上和其他博客上,怎么都说利用无阻赛技术可以放到head中,且运行时不会阻塞其他操作呢?这点让我很费解

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 13:37

@猴子猿: 运行是指加载js的js代码,而不是加载后的js代码,加载后的js代码运行一样会阻塞其他操作

支持(0) 反对(0) 上帝之城 | 园豆:2549 (老鸟四级) | 2016-05-08 16:35

@上帝之城: 那这样‘无阻赛’就不能将动态创建的script元素添加到head中咯,比如利用script dom element技术实现无阻赛,当加载成功后,这种方式加载的代码会立刻执行的。文件的下载和执行过程不就会阻塞页面其他进程了嘛?

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 17:55

@猴子猿: 下载过程中不会阻塞页面其他js代码的执行

支持(0) 反对(0) 上帝之城 | 园豆:2549 (老鸟四级) | 2016-05-08 19:32

@上帝之城: 麻烦问下执行呢?

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 20:49

@猴子猿: 执行过程会阻塞

支持(0) 反对(0) 上帝之城 | 园豆:2549 (老鸟四级) | 2016-05-08 21:10

@上帝之城: 

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 21:11

@上帝之城: 你好,这是《高性能JavaScript》中说的,利用script dom element技术,不仅下载不会阻塞,执行也不会阻塞。让人费解

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 21:12
1

就是告诉浏览器,这个js文件先下载着,不用执行,等页面都加载好了在执行

收获园豆:35
刘宏玺 | 园豆:14020 (专家六级) | 2016-05-08 14:00

利用script dom element技术实现无阻赛,当加载成功后,这种方式加载的代码会立刻执行的。但文件的下载和执行过程不会阻塞页面其他进程。怎么理解?

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 14:03

@猴子猿: 也就是说这个js在下载和执行的时候,其他的资源可以同步下载

js执行是单线程,html渲染也是这个单线程,但是请求资源可以多个线程一起下载,只不过有些浏览器在同一个域名下只能最多5个一起下载

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-05-08 17:56

@刘宏玺: 恩恩,同步下载是可以的,但是下载完了立即执行,这个立即执行,难道不会影响进程?

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 20:51

@猴子猿: 只要是执行,都会占用这个线程

如果当前线程正在渲染html那么就会停止渲染,然后执行js,等js执行完毕再去渲染html

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-05-08 22:34

@刘宏玺: 对的,那通过利用script dom element技术实现无阻赛,执行时,为什么会不影响其他进程呢?

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 22:37

@刘宏玺: 

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 22:37

@刘宏玺: 这是《JavaScript高性能》出处

支持(0) 反对(0) 猴子猿 | 园豆:116 (初学一级) | 2016-05-08 22:37

@猴子猿: 这个只是实现了请求资源无阻赛

支持(0) 反对(0) 刘宏玺 | 园豆:14020 (专家六级) | 2016-05-09 09:52
0

个人理解,无论JS放哪里,浏览器在加载完页面资源后总是先对页面渲染,渲染完后再执行的js.

收获园豆:15
丶飘零丶 | 园豆:98 (初学一级) | 2016-05-17 20:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册