停止在临时变量中保存'this'

dag*_*da1 6 javascript

我不得不持有this一个临时变量,以便在其他函数中访问它.例如,在下面的两个方法中,我持有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)
        }
    });
},
Run Code Online (Sandbox Code Playgroud)

反正在这周围还是我可以使用apply

Fel*_*ing 4

ECMAScript 5 推出Function.bind()[docs],因此仅受较新的浏览器支持。可以在我链接到的文档中找到替代实现。如果您将其包含在代码中,bind()则也可以在其他(较旧的)浏览器中使用。

this它允许您设置函数中应引用的对象。所以你可以写:

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)
    });
},
Run Code Online (Sandbox Code Playgroud)