浏览器在导入html页面的外部javascript时首先做了什么?它是否尝试编译它?
我问了这个问题,因为当我尝试首先导入cluetip jquery js文件然后导入Jquery.js文件时出现异常。
这有效:
<script src="/pollweb1/jquery.js" type="text/javascript"></script>
<script src="/pollweb1/jquery.cluetip.js " type="text/javascript"></script>
这不起作用:
<script src="/pollweb1/jquery.cluetip.js " type="text/javascript"></script>
<script src="/pollweb1/jquery.js" type="text/javascript"></script>
我可以看到,为了使jquery.cluetip.js工作,它需要jquery.js文件。但为什么订单很重要?浏览器在导入javascript文件后是否尝试编译它?
答案 0 :(得分:5)
顺序很重要,因为cluetip.js
文件依赖jquery.js
,浏览器按照遇到的顺序加载脚本。当浏览器尝试加载cluetip.js
脚本时,它会尝试使用这些依赖项。由于没有加载jQuery,依赖于jQuery的语句失败。
另一方面,Javascript是一种解释型语言,脚本从未实际编译过。这就是为什么你在发生故障时在运行时发现大多数错误的原因,如果它被编译,你会在访问你的网页之前收到错误提醒。当浏览器遇到脚本时,它开始执行它。大多数情况下,任何实际操作都会被延迟,直到页面被加载为止,因此前几个任务主要建立全局变量/对象,如jQuery或注册jQuery插件。
我认为cluetip.js
插件尝试向jQuery
注册,但由于尚未加载,因此无法找到它,这进一步说明了订单的重要性。
一如既往,最好的参考是actual specification。
通过一个简短的例子来说明这一点。图像我们有一个包含这些脚本的页面:
<强> OurPage.html 强>
<head>
<script type="text/javascript" src="script1.js"></script>
<script type="text/javascript" src="script2.js"></script>
</head>
脚本:
<强> script1.js 强>
alert(msg); //msg is undefined
<强> script2.js 强>
var msg = "hello world";
浏览器首先加载script1.js
,尝试提醒msg
变量,但msg
变量包含在尚未加载的script2.js
中,因此我们是浏览器通知msg
未定义。这就是你的例子中发生的事情,只是在更大的层面上。