3

对于许多 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

4 回答 4

2

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

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

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

于 2013-02-13T21:28:03.973 回答
2

如果您的迭代器函数类似于对象上的方法,这将很有用:

var context = {'a': 'a',  foo: function(x) { console.log( this.a + x); }};
_.each([1, 2, 3], context.foo, context);
于 2013-02-13T21:28:50.150 回答
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);
于 2013-02-13T21:33:44.890 回答
0

截至版本,下划线中约有 21 个函数接受“上下文”作为最后一个可选参数。

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

迭代一个元素列表,依次将每个元素生成一个 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。

于 2015-03-15T17:16:19.327 回答