javascript - 在声明之前引用 JavaScript 值 - 有人可以解释一下吗

标签 javascript

我希望有人能向我解释为什么在浏览器中查看 HTML 时,以下 JavaScript/HTML 会显示“door #2”:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <script type="text/javascript">
        function testprint() {
            alert('door #1');
        };

        window.onload = testprint;

        function testprint() {
            alert('door #2');
        };

        testprint = function() {
            alert('door #3');
        };
    </script>
    <script type="text/javascript">
        function testprint() {
            alert('door #4');
        };
    </script>
</head>
<body>
</body>
</html>

因为只有声明 testprint 出现在 window.onload 设置为 testprint 之前,我希望 window.onload 导致“door #1”出现。实际上,onload 会导致“door #2”。请注意,无论是否包含 testprint 的第一个声明,它都会执行此操作。

testprint 的第三个和第四个声明使用不同的方法分配函数,我试过它是否会覆盖 window.onload 的行为是 testprint 的第二个声明。它没有。请注意,如果我将 testprint 的第四个声明移动到第一个脚本 block 的末尾,它将被 window.onload 调用。

最佳答案

函数声明是提升的主题,它们在解析时被评估,通过提升意味着它们可用于声明它们的整个范围,例如:

foo(); // alerts foo
foo = function () { alert('bar')};
function foo () { alert('foo');}
foo(); // alerts bar

第一次调用 foo 将执行函数声明,因为在解析时间它可用,第二次调用 foo 将执行在运行时声明的函数表达式

有关函数表达式和函数声明之间差异的更详细讨论,请查看 this questionthis article .

关于javascript - 在声明之前引用 JavaScript 值 - 有人可以解释一下吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1710424/

相关文章:

javascript - 遍历递归json树并合并

javascript - 如何通过在javascript中搜索多个属性值来逐个筛选?

javascript - setState 和 setInterval 导致 "Warning: Can only update a mount or mounting component."

javascript - 使用 JavaScript while 循环将图像数组绘制到 HTML5 canvas

JavaScript 初始化函数

javascript - 通过for循环连接字符串

javascript - 元素重叠时移动

javascript - 如何将 JSON 转换为用于创建对象的类

javascript - createJS - 容器中多个对象的随机移动

javascript - module.exports = Promise.all 在测试中不起作用