Есть ли способ, которым я могу сократить jquery каждый? или есть ли альтернатива написанию jquery, каждый из которых короче кода ниже?
$('someElement').each(function () {
functionName('value1', value2)
});
$('anotherElement').each(function () {
functionName('value1', value2)
});
$('andMoreElement').each(function () {
functionName('value1', value2)
});
functionName(foo, element){
//function code here
}
Ответ 1 · рейтинг 3 · T.J. Crowder
Что касается последней версии вопроса, где все три each используют одни и те же значения, лучше всего использовать селекторы с последовательностью запятых (если это селекторы ) или функцию add (если это не так):
$('someElement, anotherElement, andMoreElement').each(function () {
functionName('value1', value2)
});
functionName(foo, element){
//function code here
}
or
$('someElement').add('anotherElement').add('andMoreElement').each(function () {
functionName('value1', value2)
});
functionName(foo, element){
//function code here
}
Опять же, это зависит от того, являются ли 'someElement', 'anotherElement' и т. д. селекторами или элементами.
Поскольку вы используете each, который сразу же вызывает функцию, вы можете также использовать параметр curry ниже. Если бы вы использовали click или подобное, использование параметра curry ниже изменило бы, когда value2 был оценен (с момента вызова функции до момента ее каррирования), что может быть желательным или нежелательным в зависимости от вашего варианта использования.
Ответ на более раннюю версию вопроса:
К сожалению, вы не можете использовать для этого $.proxy или Function#bind, так как они оба изменят значение this в вызове. Вы можете создать curry функцию, которая повторно использует this, с которым она была вызвана:
var slice = Array.prototype.slice;
function curry(f) {
var args = slice.call(arguments, 1); // Copy args after `f`
return function() {
return f.apply(this, args.concat(slice.call(arguments, 0)));
};
}
Когда вы передаете функцию и X аргументов в curry, она возвращает функцию, которая при вызове вызовет исходную функцию со значением this, с которым она была вызвана, аргументами, предоставленными curry, а затем любыми аргументами, предоставленными для вызова. .
Потом:
$('someElement').each(curry(functionName, 'foo'));
$('anotherElement').each(curry(functionName, 'otherFoo'));
$('andMoreElement').each(curry(functionName, 'otherFoo'));
functionName(foo){
//function code here
}
Или, поскольку вторые два использования имеют один и тот же аргумент:
$('someElement').each(curry(functionName, 'foo'));
$('anotherElement, andMoreElement').each(curry(functionName, 'otherFoo'));
// Or:
$('anotherElement').add('andMoreElement').each(curry(functionName, 'otherFoo'));
functionName(foo){
//function code here
}
Ответ 3 · рейтинг 1 · Andy
Изменить: это позволит вам передавать параметры в соответствии с редактированием вашего вопроса.
var a = 'Function', b = 'works';
$('.a').each(foo.bind(this, a + 'foo', b + 'foo')); // (1)
function foo(a, b, i, el) {
console.log(a, b, $(el).text());
}
JSfiddle
(1) Я добавил foo к vars, чтобы доказать, что foo принимает не глобальные переменные, а передаваемые параметры.