当我添加更多<script>标签时会发生什么?</script>

时间:2013-08-22 13:46:01

标签: javascript

我正在为我的网页添加一些第三方代码。这是他们提供的代码示例:

<script type="text/javascript">
    document.write(unescape("%3Cscript src='//munchkin.marketo.net/munchkin.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script>
    Munchkin.init('123-ABC-456');
</script>

我以为我会移除一些标签并将其转换为:

<script type="text/javascript">
    document.write(unescape("%3Cscript src='//munchkin.marketo.net/munchkin.js' type='text/javascript'%3E%3C/script%3E"));
    Munchkin.init('381-KZC-440');
</script>

这现在不起作用,说明Munchkin未定义。我环顾四周read about scope但是我仍然对它为什么破坏感到困惑,订单保持不变。如果我不得不猜测我会说要被调用的JS文件在页面继续到下一个脚本标记之前被允许完全加载,而在我的版本中它继续太快。如果是这样,这可能会被用于许多优点,因为它本质上是一个“onloadcomplete”事件?

1 个答案:

答案 0 :(得分:5)

在当前脚本块终止之前,不会加载新脚本。想一想:第一个代码将产生一个DOM结构,如:

<script type="text/javascript">
    document.write(...;
</script>
<script src='//munchkin.marketo.net/munchkin.js'></script>
<script>
    Munchkin.init('123-ABC-456');
</script>

如您所见,脚本在调用document.write的脚本之后插入。因此,在评估第三个脚本元素时会加载脚本。

但如果你有

<script type="text/javascript">
    document.write(...);
    Munchkin.init('123-ABC-456');
</script>
<script src='//munchkin.marketo.net/munchkin.js'></script>

然后您尝试在加载脚本之前访问该对象。