Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объясните, пожалуйста, логику примера (https://javascript.ru/forum/misc/71706-obyasnite-pozhalujjsta-logiku-primera.html)

ArtyomZaitsev 06.12.2017 20:07

Объясните, пожалуйста, логику примера
 
Пожалуйста, объясните логику этого примера, не могу совсем разобраться.
Сначала мы вызываем функцию setupHelp(), у нас в ней есть массив объектов, есть счетчик. В счетчике мы от i=0 до i=2 записываем в переменную item объекты из массива helpText. Дальше строка описывает действие, которое запускает функцию makeHelpCallback(), в данном случае onfocus. Затем мы вызываем функцию makeHelpCallback(), которая запускает функцию showHelp(). Вопросы:
-почему это работает?
-как счетчик запоминает (и куда) что делать, если мы взяли в фокус поле ввода? Разве он не должен проработать от 0 до 2 и забыться? :help:
function showHelp(help) {
  document.getElementById('help').innerHTML = help;
}

function makeHelpCallback(help) {
  return function() {
    showHelp(help);
  };
}

function setupHelp() {
  var helpText = [
      {'id': 'email', 'help': 'Ваш адрес e-mail'},
      {'id': 'name', 'help': 'Ваше полное имя'},
      {'id': 'age', 'help': 'Ваш возраст (Вам должно быть больше 16)'}
    ];

  for (var i = 0; i < helpText.length; i++) {
    var item = helpText[i];
    document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
  }
}

setupHelp();

Aetae 06.12.2017 22:29

Цитата:

Сообщение от ArtyomZaitsev (Сообщение 472261)
...Дальше строка описывает действие, которое запускает функцию makeHelpCallback(), в данном случае onfocus.

Нет. Тогда было бы:
document.getElementById(item.id).onfocus = makeHelpCallback;
В данном случае мы вызываем makeHelpCallback на месте, с нужным параметром и вешаем на onfocus возвращённый результат, т.е.
function() {
    showHelp(help);
};
где help - сохранённый в замыкании параметр, переданный в функцию makeHelpCallback.

ruslan_mart 07.12.2017 02:35

document.getElementById(item.id).onfocus = makeHelpCallback.bind(null, item.help);

ArtyomZaitsev 07.12.2017 19:30

спасибо


Часовой пояс GMT +3, время: 19:20.