内联javascript是否会阻止UI线程?

时间:2012-09-22 16:34:02

标签: javascript blocking nonblocking src ui-thread

我在how external scripts block the UI thread上阅读了这篇很好的文章,但我不清楚阻止是否实际上是由于<script>标记或src='/myscript.js' src属性的存在。 / p>

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

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

或者这个:

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

还会阻止UI线程吗?

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

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

编辑 - 根据评论并编辑问题:

原始问题中提供的链接不是指Javscript运行的执行,而是 sync vs async 性质的Javscript加载。我将举一个例子说明为什么会出现这种阻塞。

在Javscript的回归时代,函数document.write()是让Javascript与网页交互的唯一方式。因此,当网页遇到要加载Javascript文件的请求时,浏览器必须将其他所有内容置于保持状态 - 以防Javascript文件使用document.write向流中注入内容。

在今天的世界中,这种情况并没有那么多,所以浏览器给页面设计师一种说法'我保证这个Javascript文件在加载时并不关心它并且不会使用{{1}或者其他任何棘手的事情。在完成之前,您不必冻结。

这就是现代网络浏览器具有document.write()defer属性的原因。

  1. Opera很特别,但我们会忽略它。
  2. 或整个浏览器,取决于

答案 2 :(得分:0)

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

更新(关于评论):

浏览器窗口解析HTML并使用单个线程运行JS ..所以javascript代码中需要时间才能完成的任何内容都会阻塞线程..无论它是什么..它可以是{{ 1}}或alert或其他任何内容..