如何将Backbone函数作为参数传递

时间:2016-11-22 05:37:48

标签: javascript jquery backbone.js

我需要将Backbone视图中的函数传递到同一视图中的另一个函数。我使用了以下方法,它适用于全局函数。但是当涉及Backbone视图实例时,它不起作用。

我认为问题在于传递的函数有不正确的上下文 - 请注意this在控制台中打印不同的对象。

如何正确传递函数并在正确的上下文中调用函数?

JSFiddle

//Backbone view
mainFunc: function(){
    this.intermediateFunc(this.ABC);
}
intermediateFunc : function(callback){
    console.log(this); //prints the correct view
    callback();
}
ABC : function(){
    console.log(this); //prints 'window' when passed through a function
}

1 个答案:

答案 0 :(得分:3)

最简单的方法是使用Function.prototype.bind将适当的this绑定到您的函数。像这样:

mainFunc: function(){
    this.intermediateFunc(this.ABC.bind(this));
}

回调的另一种常见方法是允许来电者提供所需的thisFunction.prototype.callFunction.prototype.apply来使用它:

mainFunc: function(){
    this.intermediateFunc(this.ABC, this);
},
intermediateFunc : function(callback, context) {
    console.log(this); //prints the correct view
    if(context)
        callback.call(context);
    else
        callback();
}

此变体可能会假设context中的this应为intermediateFunc

mainFunc: function(){
    this.intermediateFunc(this.ABC, this);
},
intermediateFunc : function(callback, context) {
    console.log(this); //prints the correct view
    context = context || this;
    callback.call(context);
}

如果您期望callback几乎总是您的视图方法之一(或普通函数),这可能很有用。

另一种方法是使用旧的var _this = this技巧并将匿名函数传递给intermediateFunc

mainFunc: function() {
    var _this = this;
    this.intermediateFunc(function() { return _this.ABC() });
}