2016-10-18 2 views
0

Я ищу способ объявить функцию без объявления одного или нескольких параметров. Это будет использоваться в тех случаях, когда вы реализуете функцию, в которой вам все равно, каково значение (например) первого аргумента.Это способ оставить аргумент функции uneclared

Например, если эта функция:

function foo(this_arg_is_unused, important_arg) { 
    doSomethingWith(important_arg); 
} 

Есть ли какой-нибудь способ, чтобы объявить его больше, как это?

function foo(, important_arg) { 
    doSomethingWith(important_arg); 
} 

Я понимаю, что я мог бы легко сделать это:

function foo() { 
    doSomethingWith(arguments[1]); 
} 

Однако это начинает становиться менее читабельным и было бы трудно (например) использовать fn.js снискать аргументы.

В настоящее время я думал, возможно, я мог бы просто использовать визуальный мнемоник, чтобы указать аргумент не используются:

function foo(ø, important_arg) { 
    doSomethingWith(important_arg); 
} 

Однако это также может иметь проблемы удобочитаемости.

Реальный пример:

Функция обратного вызова используется jQuery's .each() принимает два аргумента, первый либо индекс или свойство имя в массиве/объекте и второе это значение. Для того, чтобы манипулировать некоторые div элементы, которые вы могли бы сделать что-то вроде этого:

$($('div').each(function(index, value) { 
 
     console.log(value); // equivalent to doSomething(this) 
 
    }));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div>Nothing here</div>

Используя функцию стрелки (где, используя аргументы [] не представляется возможным)

$($('div').each((ø, value) => console.log(value)));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div>Nothing here</div>

+0

Я не думаю, что JavaScript имеет любую языковую поддержку для этого. Соглашение Haskell заключается в использовании имени, которое начинается с подчеркивания (например, '_index'). – melpomene

+0

@joews Разве вы не смотрели пример реального мира? Довольно часто. Большинство людей даже не потрудились дать обратный вызов для аргументов '.each()', поскольку 'this' является удобным, но вы не можете использовать' this' в функции стрелки – Tibrogargan

+0

Я всегда использую '_' для дона ' t советы по уходу. – Redu

ответ

0

Вы не можете оставлять пустые места в функции arg Менты. Аргумент закладок работает хорошо.

Если вы не хотите, чтобы сделать это, вы могли бы написать функцию высшего порядка, который оборачивает функцию ожидать первый, одноразовый аргумент:

function withExtraArg(f, thisValue = null) { 
    return (x, ...args) => f.call(thisValue, ...args); 
} 

И написать функцию, принимая натуральное число аргументы:

function withExtraArg(f, thisValue = null) { 
 
    return (x, ...args) => f.call(thisValue, ...args); 
 
} 
 

 
// your function 
 
function log (value) { 
 
    console.log(value) 
 
} 
 

 
$($('div').each(withExtraArg(log)));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div>Nothing here</div>

+0

'f.call (args)' выглядит неправильно. Вы имели в виду 'f (... args)'? И это будет пренебрегать значением 'this'. – Bergi

+0

Исправлено, поскольку вы комментировали :-) – joews

+0

Все еще не работает, он должен быть 'f.call (thisArg, ... args)' или 'f.apply (thisArg, args)' – Bergi

0

Это есть способ л eave аргумент функции uneclared?

Нет. Просто пропущено это синтаксическая ошибка.

Возможно, я мог бы просто использовать визуальный мнемоник, чтобы указать аргумент не используется

Да, это правильный путь. Идиоматическое имя неиспользуемых параметров является подчеркивание _, известно из других языков, где оно имеет особое значение (и даже может быть использовано несколько раз):

function foo(_, important_arg) { 

Реального примером: функция обратного вызова используется JQuery-х .each()

Да, jQuery испортил порядок аргументов обратного вызова, как правило, значение идет первым. В JQuery, значение переходит в zeroeth аргумент - значение this, так идиоматическое JQuery является

$('div').each(function() { 
    console.log(this); 
}); 

Если вы не можете использовать this по какой-то причине, вам придется использовать второй параметр; нет никакого способа обойти это.

+0

Я хотел бы использовать '_', но это нарушит gettext (вот почему я склоняюсь к использованию« null »). Я знаю икону jQuery, но она не работает в функциях стрелок. – Tibrogargan

+0

@Tibrogargan Что вы подразумеваете под "gettext"? И да, [вы не должны использовать функции стрелок повсюду) (http://stackoverflow.com/q/34361379/1048572) - jQuery можно считать сломанным в этом отношении, но они вряд ли изменят его по соображениям совместимости (как всегда в JS). – Bergi

+0

[gettext] (https://www.gnu.org/software/gettext/). Есть библиотеки для него на многих языках, и многие из них (в том числе JS) используют '_' в качестве макроса/global/hook – Tibrogargan

Смежные вопросы