创建对象的区别before/afterwindow.onload

The difference between creating object before/after window.onload

如下,我创建了一个显示"object1.msg"内容的函数displayMsg,它是在onload事件之后构建的,但它显示未定义。

但是如果我把

var object1 = new testObject("Hello");

在 window.onload 之前,无论 before/after displayMsg() 函数,它都有效。

这是为什么?这两者之间的程序执行顺序有什么区别?谢谢...

function testObject(msg) {
    this.msg = msg;
}

function displayMsg() {
    document.getElementById("msgbox").innerHTML = object1.msg;
}

window.onload = function() {
    var object1 = new testObject("Hello");
    displayMsg();
}

您是在一个函数内声明 object1,因此它在该函数的范围内,不能从另一个范围访问。

试试这个:

function testObject(msg) {
    this.msg = msg;
}

function displayMsg(object) {
    document.getElementById("msgbox").innerHTML = object.msg;
}

window.onload = function() {
    var object1 = new testObject("Hello");
    displayMsg(object);
}

您正在 window.onload 函数的范围内创建 object1 对象。 这意味着您的显示消息函数中没有 object1。

您可以尝试将该对象作为参数传递给您的 displayMsg() 函数,或者将您的整个代码迁移到 onload 函数中。

编辑

只是为了回答您关于加载顺序的问题:您包含的每个脚本都会在浏览器加载后立即执行。使用 window.onload 会将该函数中的所有代码延迟到加载页面的每个脚本的位置。还要注意,您将脚本放入 html 文件的顺序 很重要 !

加载和呈现页面或元素(您可以将 onLoad 与 DOM 元素一起使用)时触发 onLoad 事件,因此位于内联的其余 javascript 代码之前读取并执行。

您的代码可能发生的情况是您在 onLoad 回调中定义了对象实例变量,因此 "object1" 超出了范围。

你可以试试这个:

var object1;   // Variable is defined in the global scope

function testObject(msg) {
    this.msg = msg;
}

function displayMsg() {
    document.getElementById("msgbox").innerHTML = object1.msg;
}

window.onload = function() {
    object1 = new testObject("Hello");
    displayMsg();
}
<div id="msgbox"></div>