Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

document.write 的「同步」问题

  对于很多大部分浏览器都已经支持的特性我们通常会采用 Polyfill,而且是先检测浏览器的支持程度,只有当不支持的情况下才引入 Polyfill。所以我经常会在 html 文件里直接放 SCRIPT 标签,里面写一小段代码去检测兼容性,检测到不支持后再去 document.write 出对应的 Polyfill 进来。
  虽然在我的记忆中,document.write 加载资源默认是同步的。但是前段时间我又傻逼地写出了这样的代码:
<script> if(!window.Promise) document.write('<script src="promise.js"><\/script>'); new Promsie(myResolver).then(myAction); </script>   用 document.write 输出的 SCRIPT 标签加载外部脚本确实是同步执行的。但是这个过程已经超出了 JavaScript 的范畴。它的「同步」也只是 DOM 执行顺序的同步,而不是当前 JavaScript 执行帧的同步。也就是说,上面的代码中虽然执行了 document.write,但它只是相当于 setImmediate 这种级别。但整个 SCRIPT 标签内的内容是一个 JavaScript 执行帧,所以后面的 new Promise 就可能是取不到的。
  这种情况下将内容分为两个 SCRIPT 标签写才是对的:
<script> if(!window.Promise) document.write('<script src="promise.js"><\/script>'); </script> <script> new Promsie(myResolver).then(myAction); </script>
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^