在我的应用程序中,我使用以下代码:
(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
?
答案 0 :(得分:1)
请注意,在函数中,this
完全由您调用函数的方式设置。如果您只使用以下方式调用该函数:
app.toHomePage()
然后在函数this
中将引用app
。但是,如果有人这样做:
var x = app.toHomePage;
...
x();
然后函数中的this
最初将是未定义的,因此它将设置为全局对象,或者在严格模式下设置为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
答案 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;
此外,根据测试等情况,可能会或不会很容易立即检测到。