0

在我的应用程序中,我使用以下代码:

(function(){
    var app={
        toHomePage:function(){
            var that=this;
            var handler={
                xx:function(){
                    //now I have to call the clear method.
                    // 1) app.clear();
                    // 2) that.clear()
                }
            };
        },
        resize:function(){},
        clear:function(){}
    }
})();

我想知道在handler方法中,使用app还是that

4

5 回答 5

1

请注意,在函数中,this完全由调用函数的方式设置。如果您只使用以下方法调用该函数:

app.toHomePage()

然后在函数内this将引用app. 但是,如果有人这样做:

var x = app.toHomePage;
...
x();

thenthis函数内最初将是未定义的,因此它将设置为全局对象,或者在严格模式下设置为undefined. apply和相同call,其中this可以设置为任何内容。

最好只使用app,因为标识符位于闭包内,因此不太可能更改其名称。顺便说一句,这是一个常见的困境。

编辑

解释监听器案例:

<input type="button" onclick="app.toHomePage();" ...>  // `this` is app.

input.addEventListener('click', app.toHomePage, false);  // `this` is the input element.

input.onclick = app.toHomePage;  //`this` is the input element.

input.attachEvent('onclick', app.toHomePage);  // this is window
于 2012-09-27T06:09:50.583 回答
0

在内部函数中,与外部函数中的对象不同,因此通过将其别名为 that,您可以确保您正在与同一个对象交谈。

简而言之,通过使用,您可以确保您使用的是同一个对象。

于 2012-09-27T06:04:19.117 回答
0

在最简单的情况下,它们都会以相同的方式工作。

当被app.toHomepage()调用时,乐趣就开始了,this所以它并不意味着app,并且变量that将被分配给其他东西 withFunction.prototype.call或 withFunction.prototype.apply

于 2012-09-27T06:08:35.327 回答
0

我同意其他人的观点,在你的情况下,调用that.toHomepage是错误的,你很可能想要调用app.toHomepage。但是如果你真的想使用该that模式,正确的方法是这样做:

(function(){
    var app = new (function(){ // using an anonymous constructor
        var that = this;

        that.toHomepage = function(){
            var handler={
                xx:function(){
                    that.clear()
                }
            };
        };
        that.resize = function(){};
        that.clear = function(){};
    })();
})();

注意很大的不同。thisvia的别名that不是在调用函数toHomepage时而是在构造对象时完成的。这意味着当toHomepage被调用时,你会得到that你真正想要的,而不是this函数调用发生时发生的任何事情。

于 2012-09-27T06:21:58.513 回答
0

使用“that”会更好的一个原因是

假设这是一个很大的代码库,在您的函数中,您最终将“app”变量名分配给其他对象。在这种情况下,使用“应用程序”会破坏事情。

如果您使用“that”,您可以放心,随着代码大小的增加或其他一些开发人员占用您的代码等,不会发生这种情况。

 var app= {// your module}
 // ...... some lines of code
 var prevApp = app;
 // now lets say you do that.
 app = newModule;

此外,取决于测试等,它可能会或可能不容易立即检测到。

于 2012-09-27T21:49:56.417 回答