我理解JS在执行代码之前会对函数进行预编译。所以功能顺序无关紧要。但是,在链接* .js文件时,函数顺序会以某种方式成为问题。
例如,
<script src="@Url.Content("~/Scripts/Personal/MyJScript.js")" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
hello();
afterCall();
hello2(); //fails, defined in MyJScript2.js
});
function afterCall() {
alert('inline function defined after call');
}
</script>
<script src="@Url.Content("~/Scripts/Personal/MyJScript2.js")" type="text/javascript"></script>
在上面的代码中,函数hello2()
在定义调用后链接的文件中定义。通话失败。所以,直觉上我假设现在功能顺序 在这种情况下很重要。
考虑到我执行$(document).ready
,文档应该尽可能准备好。那么,为什么会这样呢?
<小时/> 根据要求,这是客户端HTML
<body>
<script src="/Scripts/Personal/MyJScript.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
hello();
afterCall();
hello2(); //fails
});
function afterCall() {
alert('inline function defined after call');
}
</script>
<script src="/Scripts/Personal/MyJScript2.js" type="text/javascript"></script>
</body>
答案 0 :(得分:1)
我认为问题不是顺序,而是$(document).ready在返回js内容之前执行,因此函数在被调用时尚未加载。
准备好的文档旨在保证DOM的准备,而不是所有的http调用都已完成,而且我非常确定通常的脚本阻止在这种情况下不适用。
为了它的价值,我重新创建了测试并成功运行,证明顺序无关紧要,这是一个时间/加载问题:http://havenshade.com/tmp/testalert.html
我找不到一个快乐的解决方案:(
答案 1 :(得分:0)
在外部JS文件的其他请求完成之前,可能会执行(或尝试)正文中的脚本标记。
与负载顺序和时间相比,它不是函数声明顺序的问题。
答案 2 :(得分:0)
您可以使用getScript来获取脚本并在成功回调中执行某些功能,而不是使用脚本标记来导入MyJscript2。