问题描述
|
我一直必须在临时变量中保留ѭ0以便在其他函数中访问它。例如,在下面的两种方法中,我将ѭ0保留在
that
变量中:
startTimer: function () {
var that = this;
if ($(\'#defaultCountdown:hidden\'))
$(\'#defaultCountdown\').show(\'slow\');
shortly = new Date();
shortly.setSeconds(shortly.getSeconds() + 5);
$(\'#defaultCountdown\').countdown(\'change\',{ until: shortly,layout: \'<ul id=\"errorList\"><li>Next update in <b>{snn}</b> {desc}</li></ul>\',description: \'seconds\',onExpiry: function () {
that.performUpdate();
}
});
},performUpdate: function () {
var that = this;
this.message.fetch({
success: function () {
$(\'#calleesstatuses\').html(\'\');
that.callees.refresh(that.message.get(\"Callees\"));
$(\'#defaultCountdown\').hide(\'slow\');
that.startTimer();
},error: function (request,settings) {
that.killCountDown();
showErrorMessage(request.responseText)
}
});
},
无论如何,还是可以用apply
?
解决方法
ECMAScript 5引入了“ 5” [docs],因此只有新的浏览器才支持。可以在我链接的文档中找到替代实现。如果将其包含在代码中,则也可以在其他(旧)浏览器中使用use6。
它允许您设置函数中应引用的对象“ 0”。所以你可以这样写:
performUpdate: function () {
this.message.fetch({
success: function () {
$(\'#calleesStatuses\').html(\'\');
this.callees.refresh(this.message.get(\"Callees\"));
$(\'#defaultCountdown\').hide(\'slow\');
this.startTimer();
}.bind(this),error: function (request,settings) {
this.killCountDown();
showErrorMessage(request.responseText)
}.bind(this)
});
},
, 我认为这是最简单的方法。这是我的工作(尽管我正在编写GWT代码),以在内部匿名函数中引用包装函数的this
。
即使可能会出现诸如this.wrappingMethod.this
之类的内容,但仍将this
存储在根据您的喜好命名的变量中的可读性更高(当然,您可以使用更具描述性的名称),并且(仍然假设您以某种方式冷落地引用了包装范围),它将更加健壮,因为您可以引入另一个级别,而不必重写所有引用。
, 不,没有。闭包中的this
值将不同于定义闭包的范围,因此使它更整洁的唯一方法是在对象级别上对其进行定义,因此至少每个对象只需要执行一次,看来您已经在做了。
编辑:
删除\“ No no not \\\”,因为bind
是一个有效的选择,并且具有可比性实现(请参见其他答案)。尽管我个人认为ѭ14更干净,每个对象只需要定义一次,但这是一个优先事项。
, 我想这不是很舒服,但是如果原始的ѭ0是唯一可以在其中执行startTimer
和ѭ17functions之类的功能的上下文,那不是真的。我建议给它起一个更有意义的名称,例如timer
之类的东西。确实,this
只是一个方便的关键字,用于引用我们正在执行的任何内容的所有者,并且应随着所有者的更改而更改。如果\“ this / that \”变得难以阅读,解决方案是将名称从change2更改为更具语义意义的名称。
, 您正在执行的是JavaScript中的标准模式,除了传统上使用use21ѭ而非that
。但是您可以像这样使用bind()
方法:
onExpiry: performUpdate.bind(this);
如果您使用的框架扩展了Function
的原型以使其包含在内,或者您的Java解释器足够新。 (bind
在幕后创建了相同类型的匿名函数,但可以说效率较低,因为它必须处理各种特殊情况)。