使用下划线中的_.each调用骨干对象中的方法

时间:2013-04-01 04:41:50

标签: javascript backbone.js underscore.js

我是一个Backbone,Javascript,jQuery noob并试图解决问题。在我的Backbone视图中,我有这个方法:

    setError: function (selection, text) {
        console.log("set error");
        this.$el.find(selection).html(text);
        this.$el.find(selection).show();
    },

我想从另一个填充错误字段的方法调用此方法,并在div中追加其他消息。所以我尝试像这样调用setError:

     populateErrors: function (sampleErrors) {
       console.log("populateErrors");
        _.each(sampleErrors, function (sample) {
            // Set the error
            this.setError('#sample-error', 'test');
            $('#sample-validation-form').append('<p>testing</p>');
        }, this);
    }

我不明白的是如何调用setError。所以如果我在_.each语句之外调用它,我可以执行this.setError。这对我来说很有意义,因为我用这个Backbone对象调用了setError。至少那是我解释它的方式。如果不正确,请告诉我。

但是在_.each语句中,我想,因为我将语句与this绑定为最后一个参数,我认为在setError之前我不需要this。但是当我尝试这个时,我得到setError是未定义的。那么我尝试this.setError,如上所示,但是当我在_.each循环之外调用this.setError时,我没有得到我的“测试”输出。有人可以向我解释这个函数上下文在这个例子中是如何工作的。我完全糊涂了!提前谢谢!

2 个答案:

答案 0 :(得分:1)

当你传递一个对象foo作为第三个参数时,你会说:在匿名函数中,this应该是foo

populateErrors: function (sampleErrors) {
    // `this` is the Backbone view here
    this.setError('#sample-error', 'test');

    _.each(sampleErrors, function (sample) {
        // since you passed the view (this) to `each`
        // `this` is the Backbone view here also
        this.setError('#sample-error', 'test');
    }, this);
}

答案 1 :(得分:0)

_.each的第三个参数是上下文。 javascript函数的上下文是对函数中“this”的引用。通过传递“this”,您可以保持当前的背景。

例如:

populateErrors: function (sampleErrors) {
   var x = {
          blah: "x context"
       };

   this.blah = "orig context";

   console.log("populateErrors");

    _.each(sampleErrors, function (sample) {
        // Here, your current context is the same context as 
        // when you called populate Errors
        // this.blah === "orig context";
    }, this);

    _.each(sampleErrors, function (sample) {
        // Here, you've defined a different context.
        // this.blah === "x context";
    }, x);
}

唯一可以避免使用“这个”的时间。在你的表达式前面是你使用“with”关键字。见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with