_.each上下文变量

时间:2013-02-13 21:17:03

标签: javascript underscore.js

我不理解许多underscore.js函数的上下文变量的用途。它的用途是什么。我知道它在迭代器回调中绑定了“this”,但我不明白它的实际应用。

var context = {'a': 'a'};
_.each([1, 2, 3], function(element, index, list)
{
    console.log(this);
    console.log(element);
    console.log(index);
    console.log(list);
}, context);

4 个答案:

答案 0 :(得分:2)

下划线的_.each看起来像这样:

_.each(list, iterator, [context])

当迭代器是您创建的某个对象的成员,并且您希望在对象范围而不是窗口中执行该函数时,上下文非常有用。如果您用作迭代器的预编写函数使用this来引用Object的实例(通常就是这种情况),则调用不带上下文的函数将导致this引用错了。

答案 1 :(得分:2)

如果 iterator 函数类似于对象上的方法,那么它很有用:

var context = {'a': 'a',  foo: function(x) { console.log( this.a + x); }};
_.each([1, 2, 3], context.foo, context);

答案 2 :(得分:0)

当你不需要改变上下文时,它真的很有用,不要忘记它是硬依赖兄弟Backbone。

var Collection = Backbone.Collection.extend({
//..
    _toggleActive: function (model, state) {
        model.set({
            active: state
        });
    },
    deactivateAll: function () {
        // analog _.each(this.models , func, [context])
        this.each(function (model) {
            // call the method of collection from context
            this._toggleActive(model, false);
        }, this);
    }
//..
});

或仅用于调试

_.each([1,2,3], function(item, i, arr){
    this.log(item, i);
}, console);

答案 3 :(得分:0)

从版本开始,下划线中约有21个函数接受' context'作为最后的可选参数。

_。each(list,iteratee(element,index,list),[context])

迭代一系列元素,然后依次产生一个iteratee函数。如果传递了一个,则iteratee绑定到上下文对象。

var array_1 = ['asdf', 'ghjk', 'lzxc', 'vbnm', 'qwer', 'tyui', 'op'];
var array_2 = [1,0,2,9,3,8,4,7,5,6];

_.each(array_1, function(element, index, list){
    console.log(this.length - index + " - " + this[this.length - index]);
}, array_2);

将输出

1 - asdf
0 - ghjk
2 - lzxc
9 - vbnm
3 - qwer
8 - tyui
4 - op

这里对应于上下文数组array_2。