使用this或函数名称有什么不同

时间:2012-09-27 05:57:00

标签: javascript closures

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

(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方法,使用appthat

5 个答案:

答案 0 :(得分:1)

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

app.toHomePage()

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

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

然后函数中的this最初将是未定义的,因此它将设置为全局对象,或者在严格模式下设置为undefinedapplycall也是如此,其中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

答案 1 :(得分:0)

在内部函数中,与外部函数不是同一个对象,因此通过将其别名化,可以确保与同一个对象进行通信。

简而言之,通过使用 this ,您可以确保使用相同的对象。

答案 2 :(得分:0)

在最直接的情况下,他们两个都会一样。

app.toHomepage()使用不同的this进行调用时开始有趣,因此它不代表app,变量that将被分配给{{3}的其他内容}或Function.prototype.call

答案 3 :(得分: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(){};
    })();
})();

注意最大的区别。在调用函数this时,而不是在构造对象时,不会通过that进行toHomepage的别名。这意味着当调用toHomepage时,您将得到您真正想要的that,而不是函数调用发生时的this

答案 4 :(得分:0)

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

假设它是一个很大的代码库,在你的函数中,你最终会将'app'变量名称分配给其他对象。在这种情况下,使用'app'会破坏事物。

如果您使用'that',您可以放心,随着代码大小的增加或其他开发人员占用您的代码等不会发生。

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

此外,根据测试等情况,可能会或不会很容易立即检测到。