为什么JavaScript函数可见性取决于HTML中相同或不同脚本块中的声明

Vla*_*mir 17 html javascript

如果我在HTML标记中实现以下JavaScript代码块:

    <script type="text/javascript">
        function MyFunc() {
            alert(1);
        }
        var f1 = MyFunc;
    </script>
    <script type="text/javascript">
        function MyFunc() {
            alert(2)
        }
    </script>
    <script type="text/javascript">
        f1();
    </script>
Run Code Online (Sandbox Code Playgroud)

我收到一条警告信息'1'.但是,如果我使用以下代码:

<script type="text/javascript">
            function MyFunc() {
                alert(1);
            }
            var f1 = MyFunc;
            function MyFunc() {
                alert(2)
            }
        </script>
        <script type="text/javascript">

        </script>
        <script type="text/javascript">
            f1();
        </script>
Run Code Online (Sandbox Code Playgroud)

我得到'2'.为什么?测试了IE10,最新的FF,Chrome.

Rob*_*obG 15

每个脚本元素都按顺序进行解析和执行.在第一种情况下,在处理第二个声明之前进行f1的赋值.

在第二种情况下,在进行赋值之前解析两个声明(因为声明是在执行任何代码之前处理的),因此第二个声明将在赋值给f1之前替换第一个声明.

  • 正确,因此在第一种情况下*f1*引用第一个函数,然后通过第二个声明将新对象分配给*MyFunc*.所以*f1*继续引用*MyFunc*的值改为引用第二个函数后的第一个函数. (2认同)

Nie*_*sol 15

这是由吊装造成的.varfunction声明被提升到它们所在的脚本块的顶部.

这意味着您的第一个脚本基本上变为:

var f1;
function MyFunc() {
    alert(1);
}
f1 = MyFunc;

// new script block

function MyFunc() {
    alert(2)
}

// new script block

f1(); // alert 1
Run Code Online (Sandbox Code Playgroud)

同时,你的第二个脚本变为:

var f1;
function MyFunc() {
    alert(1);
}
function MyFunc() { // overwrite previous MyFunc
    alert(2)
}
f1 = MyFunc;

// new script block

f1(); // alert 2
Run Code Online (Sandbox Code Playgroud)

我希望这是有道理的 - 通常只是避免覆盖函数XD

  • @Zword - 我认为自己是英语和javascript的中间人,我根本不理解你的答案,它与范围,本地或全局无关,以及与提升和解析标签的方式有关的一切. (2认同)