我一直在使用:
var t_this = this; // Used inside anonymous functions
在处理'class'中的匿名函数时已经有一段时间了,但总是带着不安,因为它看起来像代码味道。这是一种不好的做法吗?还有更好的选择吗?
示例:
$("#container").click(function() {
t_this.doSomething();
});
答案 0 :(得分:3)
这是一种常见做法;这没什么不对。
但是,下划线通常不用于Javascript标识符;我将变量命名为me
或self
(或甚至that
)
答案 1 :(得分:2)
完全没有,虽然我通常称之为$this
(如果它是一个正确的jQuery对象)或that
,除非我能给它一个更具描述性的名称。
答案 2 :(得分:2)
这是在外部范围中引用this
的值的标准方法。例如,考虑一下:
function output() {
var t_this = this;
$("#container").click(function() {
t_this.doSomething();
});
}
this
处理程序中click
的值与外部函数中this
的值不同。将其值分配给另一个变量正是解决此问题的方法。
答案 3 :(得分:1)
除了可能选择更好的名称之外,在许多情况下都建议使用此做法,并通过减少对当前作用域之外的对象查找的调用来充当缓存机制。建议不仅仅是this
。
例如,如果您有一个超出当前范围的对象,如:
var Application = {
a: {
b: {
c: {}
}
}
};
您需要缓存它以减少遍历对象的处理。而不是:
Application.a.b.c.doSomething();
// later
Application.a.b.c.doSomething();
缓存它,更快:
var c = Application.a.b.c;
c.doSomething();
// later
c.doSomething();
通过这种方式,c只被查询一次,而不是多次。
答案 4 :(得分:1)
另一种方法是使用proxy。
$("#container").click($.proxy(
function() { this.doSomething(); },
this // you can use any variable here, and it will be called 'this' inside the function
));
这样您就可以将上下文传递给内部范围。不是说它更好,但也许它对你来说味道更好。我更喜欢这种方式。
答案 5 :(得分:0)
我不明白,为什么你需要别名这个而不是使用它?当我有另一个与不同调用者的嵌套匿名函数时,我只将此作为别名。例如:
$('#container').click(function() {
// this refer to #container
this.doThis();
// alias this
objPointer = this;
// call a function on different objects
$('div.class').click(function(){
// this now refer to div.class
this.doElse()
// objPointer refer to #container
objPointer.doThis()
});
});