2

我阅读了这篇关于外部脚本如何阻塞 UI 线程的好文章,但我不清楚阻塞实际上是由于存在<script>标记还是src='/myscript.js'src 属性。

我的问题是内联 javascript(缺少 src 属性声明),例如:

<script type='text/javascript'> alert('am i blocking too?');</script>

或这个:

<script type='text/javascript'> var php='<?=json_encode($myObj)?>';</script>

还阻塞了UI线程?

4

3 回答 3

6

任何 JS 文件的加载或任何 JS 的任何执行无论是在外部文件中还是在内联文件中)都会阻塞 UI 线程。

标记的例外<script>是异步加载,其中脚本将在后台异步加载和执行。

还有“延迟”加载(即defer属性),它告诉浏览器在页面的其余部分加载之前不要实际执行其中的 JS。

于 2012-09-22T16:41:19.250 回答
2

web workers它们自己的野兽之外,将 HTML 网页和相关的 Javascript 视为单线程。 [1]

因此,如果页面上正在运行任何javascript,则整个用户界面都会被阻止。之类的东西window.alert()window.confirm()window.prompt()阻止整个 UI 直到它们被清除,但即使是无限循环也会冻结浏览器窗口 [2] 直到它完成。

编辑 - 基于评论和编辑问题:

原始问题中提供的链接不是指运行 JavaScript 的执行,而是指 JavaScript 加载的同步异步性质。我将举一个例子说明为什么会发生这种阻塞。

在过去的 Javascript 时代,该函数document.write()是让 Javascript 与网页交互的唯一方法。因此,当网页遇到加载 Javascript 文件的请求时,浏览器必须暂停其他所有内容——以防 Javascript 文件用于document.write向流中注入某些内容。

在当今世界,这种情况发生得并不多,因此浏览器为页面设计者提供了一种方式来表达‘我保证这个 Javascript 文件并不关心它何时加载,它不会使用document.write()或任何其他棘手的事情。在完成之前,您不必冻结。

这就是现代网络浏览器具有 adeferasync属性的原因。

  1. Opera 很特别,但我们会忽略它。
  2. 或整个浏览器,具体取决于
于 2012-09-22T16:43:33.463 回答
0

alert()或任何其他提示操作将阻塞线程,直到用户响应提示。不管他们在哪里...

更新(关于评论):

浏览器窗口解析 HTML 并使用单个线程运行 JS。因此,javascript 代码中需要时间才能完成的任何内容都会阻塞线程。无论它是什么。它可以是 analert或 anAJAX Request或其他任何东西..

于 2012-09-22T16:36:45.327 回答