停止将“ this”保留在临时变量中

问题描述

| 我一直必须在临时变量中保留ѭ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
在幕后创建了相同类型的匿名函数,但可以说效率较低,因为它必须处理各种特殊情况)。