Javascript对象在函数中创建后未定义

时间:2012-07-24 21:07:13

标签: javascript function object

我似乎无法从函数返回一个对象,函数内的console.log打印出属性值很好但是一旦在函数外面我得到“Uncaught ReferenceError:firstOn is not defined”

任何帮助将不胜感激,谢谢!

myElement = document.getElementById("testButton");

function Server(name,tables,startTime) {
    this.name = name;
    this.tables = tables;
    this.startTime = startTime;
}


document.forms.server1.button.onclick = function() {
    var name = document.forms.server1.servername.value;
    var tables = document.forms.server1.servertables.value;
    var startTime = document.forms.server1.servertime.value;

    var firstOn = new Server(name,tables,startTime);

    document.forms.server1.button.innerHTML = "Saved!";

    console.log(firstOn.name);
    console.log(firstOn.tables);
    console.log(firstOn.startTime);

    return firstOn;

};

myElement.onclick = function() {
    console.log(firstOn.name);
    console.log(firstOn.tables);
    console.log(firstOn.startTime);

};

4 个答案:

答案 0 :(得分:3)

firstOn对象是在本地函数范围内创建的。它在第二个函数中不可用于全局。

答案 1 :(得分:0)

我认为这是解决我问题的合适方法。

myElement = document.getElementById("testButton");

function Server(name,tables,startTime) {
    this.name = name;
    this.tables = tables;
    this.startTime = startTime;
}

var firstOn = new Server();

document.forms.server1.button.onclick = function() {
    firstOn.name = document.forms.server1.servername.value;
    firstOn.tables = document.forms.server1.servertables.value;
    firstOn.startTime = document.forms.server1.servertime.value;

    document.forms.server1.button.innerHTML = "Saved!";

    console.log(firstOn.name);
    console.log(firstOn.tables);
    console.log(firstOn.startTime);

    return firstOn;

};

myElement.onclick = function() {
   console.log(firstOn.name);
   console.log(firstOn.tables);
   console.log(firstOn.startTime);
};

答案 2 :(得分:0)

firstOn是从document.forms.server1.button.onclick事件处理程序创建并返回的对象。该事件处理程序的返回值进入系统(事件处理程序返回的位置)并且从未存储在任何地方,因此系统使用垃圾回收对其进行了清理。

与此同时,您的myElement.onclick事件处理程序无法访问firstOn对象,因为它未保存在myElement.onclick可以到达的任何位置。

如果希望firstOndocument.forms.server1.button.onclick事件处理程序之后可用,则必须将其保存在第二个单击处理程序可以使用的位置。这可以是全局变量,也可以是全局可访问的其他对象的属性。正如您的代码现在编写的那样,firstOn对象已创建,但从未存储在任何地方,因此垃圾收集器很快就会清理它,而其他代码无法访问它。

答案 3 :(得分:0)

var firstOn = new winMain.Server(name,tables,startTime);