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:这就是为什么我指出可以在文档中找到替代实现的原因。