3

多くの underscore.js 関数のコンテキスト変数の目的がわかりません。それはどのような目的に役立ちますか。iterator コールバックで "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])

コンテキストは、イテレータが作成したオブジェクトのメンバーであり、その関数をウィンドウではなくオブジェクトのスコープで実行したい場合に非常に便利です。イテレータとして使用している作成済みの関数がthisObject のインスタンスを参照するために使用する場合 (一般的にそうです)、コンテキストなしで関数を呼び出すと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

コンテキストを変更する必要がない場合は、非常に役立ちます。頼りになる兄弟のバックボーンであることを忘れないでください。

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(リスト, iteratee(要素, インデックス, リスト), [コンテキスト])

要素のリストを反復処理し、それぞれを順番に iteratee 関数に渡します。iteratee は、context オブジェクトが渡された場合にバインドされます。

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 に答える