Javascript:'window'未定义

use*_*851 6 javascript dom

好吧,我正在尝试学习一些JavaScript,但这是一个痛苦.

以下代码给了我很多麻烦:

window.onload = function () {
    for ( var i = 0; i < seats.length; i++) {
        for ( var j = 0; j < seats.length; j++) {
            document.getElementById(getSeatId(i, j)).onclick = function(evt) {
                getSeatStatus(getSeatId(i, j));
            };
        }
    }
    document.getElementById("search").onclick = findSeat;
    document.getElementById("male_search").onclick = findMaleSeats;
    initSeats();
};
Run Code Online (Sandbox Code Playgroud)

它来自外部js文件,它是链接到页面的唯一文件.findSeat,findMaleSeats,getSeatId,initSeats都是稍后在文件中定义的.当我双击此文件时,我收到以下错误(请注意,这是我的母语翻译):

Windows脚本主机错误:未定义"窗口"代码:800A1391

我已经尝试将代码移动到文件中的其他位置,尝试为window.onload和许多其他东西分配不同的函数(甚至是空函数).看来我的电脑似乎不知道是什么窗口.如果我尝试在浏览器中打开HTML,则无法加载(正如人们所期望的那样).

有人知道这有什么问题吗?

Aym*_*hat 29

window对象表示浏览器中的打开窗口.由于您没有在浏览器中运行代码,而是通过Windows脚本宿主,因此解释器将无法找到窗口对象,因为它不在Web浏览器中,因为它不存在.

  • 好的,我们了解它的作用,但是如何解决这个问题呢? (5认同)

svi*_*gen 13

它来自外部js文件,它是链接到页面的唯一文件.

好.

当我双击此文件时,我收到以下错误

听起来你是双击/运行.js文件,它会尝试在浏览器之外运行脚本,就像命令行脚本一样.这可以解释这个错误:

Windows Script Host Error: 'window' is not defined Code: 800A1391

...不是您在浏览器中看到的错误.当然,浏览器是提供window对象的东西.

附录:作为一种行动方案,我建议打开相关的HTML文件并查看控制台.如果你在那里看不到任何东西,那么在浏览器触发事件,你的window.onload定义很可能就被击中了.window.onload


Cra*_*zit 6

尝试访问未定义的变量会抛出一个ReferenceError.

对此的解决方案是使用typeof

if (typeof window === "undefined") {
  console.log("Oops, `window` is not defined")
}
Run Code Online (Sandbox Code Playgroud)

或尝试捕获:

try { window } catch (err) {
  console.log("Oops, `window` is not defined")
}
Run Code Online (Sandbox Code Playgroud)

虽然typeof window可能是两者中最干净的,但 try catch 在某些情况下仍然很有用。