Javascript 停止持有';这';在温度变量中
为了在其他函数中访问它,我必须不断地将Javascript 停止持有';这';在温度变量中,javascript,Javascript,为了在其他函数中访问它,我必须不断地将这个保存在temp变量中。例如,在下面的两种方法中,我将this保存在that变量中: startTimer: function () { var that = this; if ($('#defaultCountdown:hidden')) $('#defaultCountdown').show('slow'); shortly = new Date(); shortly.setSeconds(shortl
这个保存在temp变量中。例如,在下面的两种方法中,我将this
保存在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)
}
});
},
startTimer:function(){
var=这个;
if($('#defaultCountdown:hidden'))
$(“#默认倒计时”).show('slow');
短=新日期();
shorty.setSeconds(shorty.getSeconds()+5);
$(“#defaultCountdown”).countdown('change',{until:不久,
布局:'- 在{snn}{desc}
中的下一次更新,
描述:'秒',
onExpiry:函数(){
那。performUpdate();
}
});
},
performUpdate:函数(){
var=这个;
此为.message.fetch({
成功:函数(){
$('#calleesstatus').html('');
that.callees.refresh(that.message.get(“被调用方”);
$('#defaultCountdown')。隐藏('slow');
那就是startTimer();
},
错误:功能(请求、设置){
那倒计时();
消息(request.responseText)
}
});
},
关于这一点,我是否可以使用apply
?不,没有。此
的值在闭包中与定义闭包的范围中不同,因此使其更清晰的唯一方法是在对象级别上定义它,这样至少每个对象只需执行一次,看起来您已经在执行了
编辑:
删除“不存在”,因为bind
是一个有效的替代方案,并且存在可比性实现(参见其他答案)。虽然我个人认为,var self=this
更简洁,每个对象只需定义一次,但这是一个优先选择的问题。我认为这是最简单的方法。这就是我在内部匿名函数中引用包装函数的This
所做的(尽管我正在编写GWT代码)
即使像this.wrappingMethod.this
这样的东西是/是可能的,将this
存储在一个根据您的喜好命名的变量中也更具可读性(当然,您可以使用一个更具描述性的名称),并且(仍然假设您以某种方式引用包装范围)它将更加健壮,因为您可以在不重写所有引用的情况下引入另一个级别。我想这并不舒服,但如果原始此
是您可以执行函数(如startTimer
和killCountdown
)的唯一上下文,则情况并非如此。我建议给它起一个更有意义的名字,比如timer
之类的。实际上,这个
只是一个方便的关键字,用来指代我们正在执行的任何东西的所有者,它应该随着所有者的变化而变化。如果“this/that”变得难以阅读,解决方案是将名称从that
更改为语义上更有意义的名称。ECMAScript 5的引入,因此它只受较新浏览器的支持。在我链接到的文档中可以找到一个替代实现。如果将其包含在代码中,也可以在其他(较旧的)浏览器中使用bind()
它允许您设置函数中应参考的对象。所以你可以写:
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)
});
},
您所做的是JavaScript中的标准模式,除了传统上使用self
而不是that
。但是您可以像这样使用bind()
方法:
onExpiry: performUpdate.bind(this);
如果您使用的框架扩展了函数
的原型以包含它,或者您的Javascript解释器足够新。(bind
在幕后创建了相同类型的匿名函数,但效率较低,因为它必须处理各种特殊情况)。就我个人而言,我希望他们不要这样做——这与这件事太相似了self
看起来很不一样。that.message.get应该是this.message.get,不是吗?值得注意的是,ECMAScript 5是一个草稿,如果你必须支持像IE6/7这样的旧浏览器,那你就完全不走运了。@Andrew:如上所述,指向MDC文档的链接提供了另一种实现方式。IE8甚至不支持它。请注意,如果这些兼容性表是正确的,这应该适用于FF/Chrome用户,但IE用户必须拥有最新版本(IE9),Opera/Safari用户运气不佳。(编辑:在用Andrew的评论刷新页面之前发布了此消息。)@Bryan:这就是为什么我指出可以在文档中找到替代实现的原因。