Javascript这并不指向正确的对象

时间:2009-07-14 20:28:51

标签: javascript class oop

示例代码:

function TestClass() {

this.init = function() {

    this.updateHeader(); // <-- error line

};

this.updateHeader = function() {
    console.log("Works");
};

};
var test = new TestClass();
$(document).ready(test.init);

当我在Firefox 3.5中运行它时,Firebug给了我一个错误,说这个.updateHeader不是一个有效的函数。我是一名Java / PHP程序员,在理解Javascript OO模型时遇到一些麻烦。我做错了什么?

如果我用简单的test.init()替换$(document).ready-line,它确实有效,但我不希望这样。

4 个答案:

答案 0 :(得分:4)

通过将函数test.init直接传递给ready()函数,您将test.init注册为回调函数。 jQuery(从你的语法判断,你正在使用)将使用它给出的回调函数,并document 的上下文中应用它。这意味着this关键字将引用document

根据建议,你应该做些什么来避免这种情况,使用一个匿名函数(闭包)来调用你所指的函数:

$(document).ready(function() {
    test.init();
});

使用function() { }语法定义要设置为回调函数的闭包是Javascript中的常见模式。

答案 1 :(得分:3)

将test.init提供给文档就绪函数实际上是为测试中的init函数提供了一个函数指针。

基本上它正在剥离init函数并在文档就绪函数的范围内执行它。

如果你把它作为$(document).ready(function(){test.init();})运行; (正如Patrick所说),它将在适当的范围内执行。

答案 2 :(得分:1)

该上下文中的“this”的范围是它所包含的函数。

答案 3 :(得分:1)

尝试$(document).ready(function () { test.init(); });

ready()需要一个函数作为参数,它将在文档准备好时执行。如果是,this将指向document对象,而不是test

解决方案是向它传递一个函数,该函数使用代码test.init()显式调用init。当您这样调用时,this(在init函数中)指向您的test对象。