2009-07-14 83 views
2

示例代码:JavaScript本不指向正确的对象

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,萤火虫给我一个错误,说this.updateHeader是不是有效的函数。我是Java/PHP程序员,并且在理解Javascript OO模型时遇到了一些麻烦。我究竟做错了什么?

如果用简单的test.init()替换$(document).ready-line,但它不起作用。

回答

4

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

你应该做些什么来避免这种情况,所建议的,是可以使用匿名函数(关闭),将调用你是指功能:

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

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

+0

当你想到它,它是有道理的:) – 2009-07-14 20:58:01

1

上下文中的“this”被限定在它所包含的函数中。

1

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

就绪()期望的功能作为一个参数,其中,当文档准备好它将执行。当它发生时,this将指向document对象,而不是test

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

3

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

本质上它是撕掉init函数并在文档就绪函数的范围内执行它。

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