Две переменные переданы в функцию, одна не определена? - PullRequest
2 голосов
/ 26 мая 2011

Где я застрял:

В свободное время я работаю на частном сайте. Мое самообучение действительно неструктурировано, и я столкнулся с огромной дырой в моих основах.

Я смотрю пример jQuery с веб-сайта API jQuery, serializeArray , и я не могу обернуться вокруг функции ShowValues.

Вот как это происходит:

function showValues() {
  var fields = $(":input").serializeArray();
  $("#results").empty();
  jQuery.each(fields, function(i, field){
    $("#results").append(field.value + " ");
  });
}

$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();

И я почти уверен, что понимаю, что происходит во всем, кроме строк 4 и 5:

  jQuery.each(fields, function(i, field){
    $("#results").append(field.value + " ");

jQuery просматривает каждый ключ в массиве fields и помещает то, что он находит, через универсальную функцию: function (i, field)

эта функция использует два своих параметра для создания строки для добавления к # результатам.

Мои вопросы :

Зачем этой функции нужны два параметра? Кажется, переменная i начинается с нуля при каждом запуске функции. и если оно удалено из функции, field.value возвращает undefined.

Поскольку значения, поступающие в двухпараметрическую функцию, организованы в массив, функция должна ... соответствовать размерам массива?

Является ли i особенным, или может быть использована любая запасная переменная?

А что происходит с field.value? .value нет в API jQuery, но я думаю, что он все еще собирает значения со второй позиции в массиве полей?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Зачем функции нужны два параметра?

Прежде всего, вам следует прочитать документацию .each .Он говорит вам, что ожидает функцию, определенную следующим образом:

callback(indexInArray, valueOfElement)

Это было решено, поэтому вы должны соблюдать его (рассуждения выходят за рамки этого ответа).

Если выопределите ваш обратный вызов как таковой

function(indexInArray, valueOfElement, foo) { ... }

, и он будет называться

callback(indexInArray, valueOfElement)

, тогда foo будет неопределенным.

Если вы определите свой обратный вызов как

function(foo) { ... }

он по-прежнему будет называться

callback(indexInArray, valueOfElement)

, а foo будет содержать indexInArray - и 0.value будет, конечно, неопределенным, если вы "пропустите * 1030"* ".

Можно ли использовать резервную переменную?

Да, можно.В большинстве функциональных языков вы найдете _, используемый для параметра, который вас не волнует (будьте осторожны, если вы используете библиотеки вроде underscore.js).Можно использовать любое другое имя.

$(...).each(function(_, elem) {
  ...
});
1 голос
/ 26 мая 2011

jQuery.each запускает предоставляемую вами функцию (здесь анонимная функция) для каждой пары ключ / значение в массиве или объекте.Это работает как итерация в функциональном языке.

Имена параметров не являются ни специальными, ни даже обязательными.Функция вызывается с текущим значением this, поэтому во многих случаях вы можете их опустить.Например, в вашем коде функция может быть изменена на function() { $("#results").append(this.value + " "); }, и она будет давать те же результаты.

Внутри функции field является DOMElement и .valueсвойство DOM 0 для доступа к атрибуту value= ввода.В вашем коде field.value эквивалентно $(field).val().

0 голосов
/ 26 мая 2011

Я полагаю, что я передан во внутреннюю работу Jquery, чтобы он мог определить, какое значение в массиве передать / использовать в функции. Без него Jquery не может сказать, где он находится на итерации.

...