Я новичок в underscore.js. Какова цель [context]
в _.each()
? Как это должно быть использовано?
162
Я новичок в underscore.js. Какова цель [context]
в _.each()
? Как это должно быть использовано?
Параметр context просто устанавливает значение this
в функции итератора.
var someOtherArray = ["name","patrick","d","w"];
_.each([1, 2, 3], function(num) {
// In here, "this" refers to the same Array as "someOtherArray"
alert( this[num] ); // num is the value from the array being iterated
// so this[num] gets the item at the "num" index of
// someOtherArray.
}, someOtherArray);
Рабочий пример: http://jsfiddle.net/a6Rx4/
Он использует число от каждого члена массива, для которого выполняется итерация, чтобы получить элемент с таким индексом someOtherArray
, который представлен, this
поскольку мы передали его в качестве параметра контекста.
Если вы не установите контекст, то this
будете ссылаться на window
объект.
someOtherArray[num]
а неthis[num]
?context
гдеthis
ссылка в вашей функции итератора. Например:источник
Контекст позволяет вам предоставлять аргументы во время вызова, что позволяет легко настраивать стандартные встроенные вспомогательные функции.
Некоторые примеры:
Даже из ограниченных примеров вы можете увидеть, насколько мощным может быть «дополнительный аргумент» для создания кода, который можно использовать повторно. Вместо того, чтобы делать разные функции обратного вызова для каждой ситуации, вы обычно можете адаптировать помощника низкого уровня. Цель состоит в том, чтобы ваша пользовательская логика связывала глагол и два существительных с минимальным образцом.
По общему признанию, функции стрелок устранили многие преимущества «кодового гольфа» общих чистых функций, но семантические и согласованные преимущества остаются.
Я всегда добавляю
"use strict"
к помощникам для обеспечения нативной[].map()
совместимости при передаче примитивов. В противном случае они преобразуются в объекты, которые обычно все еще работают, но быстрее и безопаснее быть привязанными к типу.источник
Простое использование _.each
Вот простой пример, который можно использовать
_.each
:Вывод:
Вместо
addItem
нескольких вызовов вы можете использовать подчеркивание следующим образом:что идентично
addItem
трехкратному последовательному вызову с этими предметами. По сути, он повторяет ваш массив и для каждого элемента вызывает вашу анонимную функцию обратного вызова, которая вызываетx.addItem(item)
. Функция анонимного обратного вызова похожа наaddItem
функцию-член (например, она принимает элемент) и является бессмысленной. Таким образом, вместо прохождения анонимной функции лучше_.each
избегать этого косвенного обращения и вызыватьaddItem
напрямую:но это не сработает, так как внутри
addItem
функции члена корзины неthis
будет ссылаться наx
созданную вами корзину. Вот почему у вас есть возможность передать свою корзинуx
для использования в качестве[context]
:Полный пример, который использует _.each и context:
Короче говоря, если функция обратного вызова, которую вы передаете
_.each
каким-либо образом, использует,this
то вам нужно указать, чтоthis
должно ссылаться внутри вашей функции обратного вызова. Может показаться , чтоx
является излишним в моем примере, ноx.addItem
это просто функция и может быть совершенно не связан сx
илиbasket
или любого другого объекта, например :Другими словами, вы привязываете некоторое значение к
this
своему обратному вызову, или вы можете использовать привязку напрямую, например так:В общем, если какой-то
underscorejs
метод принимает функцию обратного вызова и если вы хотите, чтобы этот обратный вызов вызывался для некоторой функции-члена некоторого объекта (например, функции, которая используетthis
), то вы можете связать эту функцию с каким-либо объектом или передать этот объект в качестве[context]
параметра, и это основное намерение. И в верхней части документации underscorejs, это именно то, что они заявляют: итерируемый связывается с объектом контекста, если он был переданисточник
Как объяснялось в других ответах,
context
являетсяthis
контекст для использования внутри обратного вызова передаетсяeach
.Я объясню это с помощью исходного кода соответствующих методов из подчеркивания исходного кода
Определение
_.each
или_.forEach
следующее:Второе утверждение важно отметить здесь
Здесь
context
передается другой метод,optimizeCb
и затем присваивается возвращаемая ему функция,iteratee
которая вызывается позже.Как видно из приведенного выше определения метода
optimizeCb
, еслиcontext
не передано, тоfunc
возвращается как есть. Еслиcontext
передано, функция обратного вызова вызывается какfunc
вызывается с помощьюcall()
которого используется для вызова метода путем установки егоthis
контекста. Таким образом, когдаthis
используется внутриfunc
, это будет относиться кcontext
.Вы можете считать
context
последним необязательным параметромforEach
в JavaScript.источник