简单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));