示例代码:
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,它确实有效,但我不希望这样。
答案 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
对象。