“this”指的是什么(在迭代集合时)

时间:2014-04-14 21:23:19

标签: backbone.js foreach underscore.js

在迭代其模型时,我尝试使用this关键字到达集合实例。这是我的测试代码:

myModel = Backbone.Model.extend({

    url: 'model.com'
});    

myCollection = Backbone.Collection.extend({

    model: myModel,
    url: 'collection.com',

    iterateAll: function(){
        this.each(function(item){
             console.log(this.url);
             console.log(item.url);
        });
    }
});

mod = new myModel();
col = new myCollection(mod);

col.iterateAll();

此代码输出:

undefined
model.com

使用this.url时如何正确引用集合?我希望输出读取collection.com而不是undefined

2 个答案:

答案 0 :(得分:0)

请改为:

...
iterateAll: function(){
    var me = this;
    me.each(function(item){
         console.log(me.url);
         console.log(item.url);
    });
}
...

有关this范围的更多信息。 http://javascriptplayground.com/blog/2012/04/javascript-variable-scope-this/

答案 1 :(得分:0)

在JavaScript中,

this非常奇怪。

iterateAll: function() {
    var self = this; // _this is also common
    this.each(function(item) {
         console.log(self.url);
         console.log(item.url);
    });
}

基本上,JavaScript没有正式区分方法功能。因此,每个函数调用 - 甚至像这样的简单匿名回调 - 都会获得自己的this值。但这经常不是......任何人都想要的东西。因此,您可以在临时变量中保留this的“有用”值,并在回调中引用它。

这是很常见的,它是CoffeeScript通过=>语法的一个功能,它将成为ES6的一个功能。在那之前......临时变量是我们得到的。