什么时候功能顺序很重要

When does function order matter?

本文关键字:顺序 功能 什么时候      更新时间:2023-09-26

我知道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>

我认为问题不在于订单,而在于$(document)。Ready在js内容返回之前执行,所以当函数被调用时,它还没有被加载。

文档准备是为了保证DOM准备好了,而不是所有的http调用都完成了,我很确定通常的脚本阻塞在这种情况下不适用。

对于它的价值,我重新创建了您的测试并成功运行,证明顺序无关紧要,这是一个定时/加载问题:http://havenshade.com/tmp/testalert.html

我没有找到一个快乐的解决方案:

正文中的脚本标签可能会在外部JS文件的附加请求完成之前执行(或尝试执行)。

不是函数声明顺序的问题,而是加载顺序和时序的问题。

不使用脚本标记导入MyJscript2,您可以使用getScript获取脚本并在成功回调中执行一些功能。