Подчеркивать как переменную JavaScript?

В этот пост, Nick Craver дал ответ, в котором он использовал:

function(_, id)

Этот код не объявляет подчеркивание как переменную перед ее использованием. Мой поиск в google и здесь указывает только на ссылки на использование подчеркивания в качестве префикса., А не как сама переменная. Что оно делает? Мне нравится решение Ника, но это немного беспокоит меня.

Ответ 1

Я видел символ подчеркивания, используемый для обозначения того, что переменная является переменной "не заботясь". Это означает, что это не имеет значения и вообще не используется.

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

Ответ 2

Underscore - это допустимое имя переменной JS. Параметр с именем _ в приведенном выше примере может использоваться как любая другая переменная.

Однако он обычно используется для указания последующему (человеческому) читателю кода, что все, что передавалось, не будет использоваться. (Автор кода может быть злым/невежественным и использовать его в функции, хотя).

Ответ 3

Как новичок, мне не удалось собрать много аспектов, связанных с этим ответом, которые разбросаны по комментариям и другим ответам. Итак, я попытаюсь объединить их ниже:

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

$(this).val('').attr('id', function(_, id) { return id + i });

В документации jQuery для функции attr здесь существует перегруженная форма attr, которая равна .attr( attributeName, function ). function в этой форме описывается как

Тип: Функция (Integer index, String attr)

Следовательно, он ожидает два параметра. Однако в нашем коде нам нужен только id, который является вторым параметром.

Теперь из-за того, как JS обрабатывает аргументы функции, мы не можем записать его как function(id), так как JS будет отображать id в index (первый аргумент, ожидаемый для function). Таким образом, функция, которую мы пишем, должна иметь два параметра.

Здесь стандартное соглашение входит в игру. Как упоминалось здесь,

Символ подчеркивания (_) используется как стандартный способ указания неиспользуемого аргумента функции.

Однако это только соглашение, а не правило. Мы могли бы назвать неиспользуемый аргумент как index или unused точно так же. То есть

$(this).val('').attr('id', function(unused, id) { return id + i });

будет действительным эквивалентом.

Таким образом, такое использование _ для замены неиспользуемого аргумента может быть использовано для любой другой функции jQuery, которая имеет аналогичную переопределенную форму. Например, в ответе this мы можем увидеть использование подчеркивания при вызове $.text(). Чтобы подтвердить, $.text() имеет переопределенную форму, которая принимает функцию с двумя аргументами, как показано здесь.

Ответ 4

По стилю _ обычно используется как переменная-заполнителя. Переменная, которая обычно не используется в области.

Ответ 5

Как и все другие плакаты, прежде чем они сказали, это можно рассматривать как заполнитель, в тех случаях, когда его нельзя использовать. Я видел что-то подобное в python, когда функция может возвращать несколько значений, но только определенные явно определены.

Например

 a, _, c = foo(bar)

В этом случае потенциальное возвращаемое значение "b" игнорируется (к которому еще можно получить доступ: _), и будут использоваться "a" и "c".

Ответ 6

Хотя все ответы объясняют, что это стиль кода "взломать", чтобы указать неиспользуемый параметр, это, как правило, плохая практика (идея). Он переопределит любую переменную _, объявленную в родительской области. Это позволит вам использовать библиотеки, которые определяют _ (например, как underscorejs). Это даже не какая-то оптимизация, поскольку она объявляет переменную в любом случае.

Лучше использовать описательное имя параметра и рассматривать _ как обычную переменную. Сокращение имен переменных также считается плохой практикой. Итак, если вы планируете использовать этот "умный взлом", не делайте этого.