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



我在使用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相互调用。

谢谢,迈克尔。

正确的做法是什么?

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

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

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

somethingThatAcceptsACallback(app.init);

someElement.onclick = app.init;

…当init被调用时,它不能调用myFunction。这是因为在JavaScript中(目前),this的设置方式主要取决于函数如何调用,而不是函数在哪里定义。在上述两种情况下,虽然对函数的引用给了其他代码,但当其他代码调用它时,它不会做任何事情来将this设置为app

您可以使用ES5的Function#bind(可以在IE8和更早的版本上闪烁)来创建函数,当调用时,使用正确的this值调用原始函数:

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

someElement.onclick = app.init.bind(app);

但是,如果app是一次性的,那么只需在函数中使用app就可以了。

更多关于this (在我的博客上):

    <
  • 神话方法/em>
  • 你一定要记住this

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

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

这段代码以便更好地理解。

在javascript中,this的变化取决于函数的调用方式。这个问题通常是通过创建一个名为self的变量来解决的,当你知道this的值

时,将this的值赋给它。
var app = {
    self: this,
    init: function() {
        self.myFunction();
    },
    myFunction: function() {
        return "Hello world!";
    }
};

最新更新