Javascript:如何在不调用的情况下'宣布'功能?

时间:2012-09-15 13:09:32

标签: javascript function call

有人能帮助我吗?

以下代码有效,但不幸的是,必须对doSomething()进行函数调用:

<body onload=init()>
</body>

<script>
    function Startscreen()
    {
        this.doSomething(); //why is this call necessary and how else to solve it?
        this.startscreenhtml = 
            "   <form onsubmit=doSomething()>   " + 
            "       <input type=text />         " +
            "   </form>                         ";
        document.write(this.startscreenhtml);
    }
    Startscreen.prototype.doSomething = function()
    {
        alert(123)
    }
</script>

<script>
    function init()
    {
        var startscreen = new Startscreen();    
    }
</script>

我确实希望将函数doSomething作为对象Startscreen的函数。

编辑:我确实想继续使用document.write

我想要在构造函数之外声明doSomething正如我现在所做的那样,因为我相信如果我多次调用新的Startscreen,则会多次创建相同的函数。

但是,我尝试了许多工作来完成这项工作而没有调用doSomething,包括在构造函数中声明函数,但没有任何效果。 我的猜测是调用是必要的,以使函数知道,因为如果代码是从上到下读取,我在我声明它之前将它分配给'onsubmit'。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

我认为代码不像您在当前表单中那样工作。创建表单时将调用doSomething函数,但在提交表单时不会调用它。

要从onsubmit事件调用该函数,必须在全局上下文中知道它,因为事件处理程序不在Startscreen实例的上下文中调用。使用当前代码,由于两个原因无法调用该函数;它不可能从全局上下文到达,并且因为没有对象实例的引用,所以甚至没有可用于调用它的实例。

(您可以从原型中获取该函数,或者创建该对象的新实例,但是使用对象进行设置将完全没有意义。)

如果要保留实例,则必须将其放在init函数中保留的变量中:

var startscreen;
function init() {
  startscreen = new Startscreen();    
}

现在,当调用onsubmit事件处理程序时,对象仍然存在,因此您可以通过变量访问该函数:

this.startscreenhtml = 
  "<form onsubmit="startscreen.doSomething()">" + 
  "<input type=text />" +
  "</form>";

这当然不是理想的,因为你将对象与变量结合起来,但我希望你对正在发生的事情有了一些了解,以便你能够挺身而出。


要在提交事件中使用该方法而不使用全局变量来查找它,您必须创建一个元素,以便可以将实际函数作为事件处理程序连接。这样您就可以从事件处理程序中获取方法:

// make a local variable that you can capture in a closure
var me = this;
var frm = document.createElement("form");
// make an anonymous function that will create a closure capturing "me"
frm.onsubmit = function(){
  me.doSomething();
};

这意味着您无法使用document.write创建表单(或者您需要为每个表单指定一个唯一的ID,以便您可以获得对创建的元素的引用并在之后挂接事件)。