在JavaScript对象文字中,我应该引用“this”还是变量名?

时间:2014-06-17 12:41:56

标签: javascript jquery

我使用this在我的对象文字中遇到问题,但是当更改为对象变量本身的名称时,我的问题就出现了。

使用时,我得到'myFunction'不是函数错误。

我应该这样做:

var app = {

    init: function() {

        this.myFunction();

    },

    myFunction: function() {

        return "Hello world!";

    }

};

或者,这个?

var app = {

    init: function() {

        app.myFunction();

    },

    myFunction: function() {

        return "Hello world!";

    }

};

这样做的正确方法是什么?

这个特殊的例子是我的问题的一个非常简化的版本,可能无法重现相同的问题,但它与我所遵循的一般模式相同,其中函数将使用this相互调用。

谢谢, 迈克尔。

3 个答案:

答案 0 :(得分:3)

  

这样做的正确方法是什么?

两者都是正确的,取决于你想要达到的目标。

如果你只是想拥有其中一个并且你不打算将这些方法复制到任何其他对象(你可以用JavaScript做),那么使用app可能更有意义。

我的猜测是你在使用this时遇到的问题是你做过这样的事情:

somethingThatAcceptsACallback(app.init);

someElement.onclick = app.init;

...当调用init时,它无法调用myFunction。那是因为在JavaScript(现在)中,设置this的方式主要取决于如何调用函数,而不是函数的定义。在上述两种情况下,虽然对其他代码提供了对 function 的引用,但当其他代码调用它时,它没有做任何事情来将this设置为{{ 1}}。

您可以使用ES5的app(可以在IE8及更旧版本上进行填充)来创建函数,这些函数在调用时使用正确的Function#bind值调用原始函数:

this

somethingThatAcceptsACallback(app.init.bind(app));

但是,如果someElement.onclick = app.init.bind(app); 是一次性的话,只需在你的函数中使用app即可。

有关app 的更多信息(在我的博客上)

答案 1 :(得分:0)

在您的第一个代码引用, app 引用相同。在我看来,我可以建议

var app = {    
    init: function() {    
        app.myFunction();   
    },   
    myFunction: function() {    
        return "Hello world!";    
    }   
}; 

此代码可以更好地理解。

答案 2 :(得分:0)

在javascript this中更改,具体取决于函数的调用方式。这个问题通常是通过创建一个名为self的变量来解决的,该变量在您明确知道this

的值的阶段被赋值为this
var app = {
    self: this,
    init: function() {

        self.myFunction();

    },
    myFunction: function() {
        return "Hello world!";
    }
};