window.np 未定义,即使它在打印 window 时出现在控制台中

window.np is undefined even though it appears in console when window is printed

我一直在尝试解决我 运行 遇到的这个问题,但不知道为什么我的代码是错误的。我有使用 javascript 为 NPM 制作的这个模块。我刚刚将该 npm 转换为 HTML 语法并将该模块导入到此 HTML 文件中。

但是当我尝试使用“window.np”访问项目时(window 是我将这些文件保存到用户计算机中的方式),它说“window.np”未定义.我不知道为什么会这样说,因为当我执行 console.log(window) 时,我可以看到 'np' 作为属性之一。但是我还是无法访问它。

这是我执行“console.log(window)”时的输出。

这是上图的放大版。

<!DOCTYPE html>
<html>
    <body>
        <script type="module" src="https://unpkg.com/numpy-matrix-js@1.1.0/src/html/index.js">
        </script>

        <script>
            console.log(window)
            console.log(window.np)
        </script>
    </body>
</html>

通过 type="module" 作为 ES6 模块包含的脚本实际上默认被延迟 (MDN),这意味着 numpy-matrix-js 脚本将 运行 在内联脚本之后。

解决这个问题的方法很简单:您需要将内联脚本的执行推迟到模块的执行之后。一种方法是 defer 属性,但由于它仅适用于外部脚本,因此您需要将其放在单独的文件中。另一种方法是监听 DOMContentLoaded:

<!DOCTYPE html>
<html>
    <body>
        <script defer type="module" src="https://unpkg.com/numpy-matrix-js@1.1.0/src/html/index.js">
        </script>

        <script>
            window.addEventListener("DOMContentLoaded",function(){
                console.log(window)
                console.log(window.np)
            });
        </script>
    </body>
</html>

有关详细信息,请参阅

至于它为何显示在控制台中,我猜测当您单击它时(即在模块具有 运行 之后),花哨的对象浏览器会查找属性,而不是在其记录时.