有没有更好的方法将“this”对象传递给回调函数?

时间:2012-02-29 04:38:35

标签: javascript backbone.js

我是backbonejs的新手。我试图将正确的this对象传递给回调函数,其中该函数是视图的一种方法。

我目前的解决方案:

APP.LocationFormView = APP.View.extend({
    initialize: function () {    
        if (navigator.geolocation) {
            var that = this;

            var success = function(position) {
                _.bind(that.onSuccessUpdatePos, that, position)();
            };

            var error = function(error) {
                _.bind(that.onFailUpdatePos, that, error)();
            }

            navigator.geolocation.getCurrentPosition(success, 
                                                     error);
        } else {

        }
    },

    onSuccessUpdatePos: function(position) {
        // We can access "this" now
    },

    onFailUpdatePos : function(error) {
        // We can access "this" now
    }
});

这是实现我想要的正确方法吗? 对此有没有那么冗长的解决方案?

2 个答案:

答案 0 :(得分:5)

我就是这样做的。 bindAll的一个不错的方面是,如果您向LocationFormView添加其他功能,它们将自动绑定this

APP.LocationFormView = APP.View.extend({
    initialize: function () {   
        _.bindAll(this); 
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(this.onSuccessUpdatePos, 
                                                     this.onFailUpdatePos);
        } else {

        }
    },

    onSuccessUpdatePos: function(position) {
        // We can access "this" now
    },

    onFailUpdatePos : function(error) {
        // We can access "this" now
    }
});

答案 1 :(得分:2)

_.bind用于以后绑定。你通常会这样做:

that.onSuccessUpdatePos(position); // that is already the context

但相反,你可以直接传递它:

var success = _.bind(that.onSuccessUpdatePos, that, position);
var error   = _.bind(that.onFailUpdatePos, that, error);

navigator.geolocation.getCurrentPosition(success, error);

也就是说,如果您感觉比“手动”解决方案更清楚。