初始化外部函数时无法访问变量

Nic*_*ner 40 javascript global-variables

当我使用这样的代码时,它工作正常:

function removeWarning() {
    var systemStatus = document.getElementById("system-status");
    systemStatus.innerHTML = "";
}

function indicateInvalidUsername() {
    var systemStatus = document.getElementById("system-status");
    systemStatus.innerHTML = "Invalid username";
}
Run Code Online (Sandbox Code Playgroud)

但是,当我想将其移动systemStatus为全局变量时,它不起作用:

var systemStatus = document.getElementById("system-status");

function removeWarning() {
    systemStatus.innerHTML = "";
}

function indicateInvalidUsername() {
    systemStatus.innerHTML = "Invalid username";
}
Run Code Online (Sandbox Code Playgroud)

我应该在这做什么?

小智 38

这实际上取决于JavaScript代码的位置.

问题可能是由于在行时没有加载DOM引起的

var systemStatus = document.getElementById("system-status");
Run Code Online (Sandbox Code Playgroud)

被执行.您可以尝试在onload事件中调用它,或者理想地使用JavaScript框架中的DOM ready类型事件.

  • 有时候我不了解SO社区:我说问题是我提出的答案中的竞争条件而且它已经被拒绝......现在我看到接受的回应实际上是一个"竞争条件"...... (4认同)

Pek*_*ica 27

确保在任何代码块之外的"root"级别声明变量.

您也可以var完全删除,虽然不建议这样做,并会发出"严格"警告.

根据MDC文档,您可以使用设置全局变量window.variablename.


lc.*_*lc. 6

我的猜测是system-status元素是在运行变量声明后声明的.因此,在声明变量时,它实际上被设置为null?

你应该只声明它,然后从onLoad处理程序中分配它的值,因为那样你就可以确定它已经正确初始化(加载)了有问题的元素.

您也可以尝试将脚本放在页面底部(或者至少在system-status声明元素后的某个位置),但不能保证始终有效.


NG.*_*NG. 6

在外部作用域中声明systemStatus并在onload处理程序中指定它.

systemStatus = null;

function onloadHandler(evt) {
    systemStatus = document.getElementById("....");
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用onload处理程序,请将脚本标记放在HTML的底部.