简单Javascript对象和;这";
快速提问。为什么下面给出了一个简单Javascript对象和;这";,javascript,function,oop,object,Javascript,Function,Oop,Object,快速提问。为什么下面给出了一个this.testFunction不是一个函数错误 Test = { data: true, testFunction: function() { this.data = true; }, initialize: function() { this.data = false; this.testFunction(); console.log(this.data);
this.testFunction不是一个函数
错误
Test = {
data: true,
testFunction: function() {
this.data = true;
},
initialize: function() {
this.data = false;
this.testFunction();
console.log(this.data);
}
};
$(document).ready(Test.initialize);
您没有调用
Test.initialize
,您正在传递它的值。这将它与上下文分离,因此当调用它时,This
不是Test
通常的解决方法是使用匿名函数表达式:
$(document).ready(function () { Test.initialize() });
您还可以使用(具有更有限的浏览器支持):
在此上下文中,这被设置为不具有函数testFunction()的全局对象。有关此关键字的详细解释,请参见下面的答案:Javascript的设计者对此关键字背后的规则有些顽皮
此
获取MemberExpression左侧的值,即:
var a = {
b: function () {
// this = a
}
};
a.b();
当您执行以下操作时,会产生问题:
var universe = {
answer: 42,
getTheAnswer: function () {
return this.answer;
}
}
var foobar = universe.getTheAnswer;
foobar();
在这种情况下,函数中的getTheAnswer
将不会绑定到universe
对象,而是绑定到全局对象,这是邪恶的。解决此问题的方法是使用bind
函数(),即:
因此,在您的情况下,您可以简单地执行以下操作:
$(document).ready(Test.initialize.bind(Test));
希望有帮助 确保将方法作为函数调用
,而不是引用调用
;类似于:$(document.ready(Test.initialize())
$(document).ready($.proxy(Test,“initialize”))
@faino-这将立即调用函数并将其返回值传递给ready()
,这不是所需的效果。@Quentin检查,显示它按预期反应。重置数据
变量是毫无意义的,因为所调用的方法会以任何方式重置变量。@faino可能是这样,但这显然不是他想要的,即在ready时调用函数,而不是立即调用。
var foobar = universe.getTheAnswer.bind(universe);
foobar(); // => 42
$(document).ready(Test.initialize.bind(Test));