Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 19.06.2017, 00:54
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

А почему? И ещё, forEach.сall - для меня новенькое. Я хотел бы узнать, чем отличаются
[].forEach.call(label, function(item, i)){...}
и
label.forEach(function(item, i)) {...}
. У меня обе работают одинаково )
А также я попробовал - для аналогии записать эту функцию через "старенькое" - цикл for. Но что-то не получается, подскажите, пожалуйста, что я сделал не так:
for (var i = 0; i < label.length; i++) 
      {
        label[i].addEventListener('click', function() {
          page.className = "page bg" + (i+1);
          });
       }

Последний раз редактировалось Alessio18911, 19.06.2017 в 01:00. Причина: убрал "+" между page и bg
Ответить с цитированием
  #22 (permalink)  
Старый 19.06.2017, 01:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от Alessio18911
У меня обе работают одинаково )
потому что не все браузеры ещё это поддерживают label.forEach
Сообщение от Alessio18911
пожалуйста, что я сделал не так:
потому что i всегда 3 на момент клика -- а bg4 у вас нет.

нужно замыкание i как в forEach
Пример ошибочного использования
Ответить с цитированием
  #23 (permalink)  
Старый 19.06.2017, 01:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

пример на понимание отличия getElementsBy от querySelectorAll
Alessio18911,
удаление тегов LI
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>

</head>

<body>
<ul>
    <li>01</li>
    <li>02</li>
    <li>03</li>
    <li>04</li>
    <li>05</li>
    <li>06</li>
    <li>07</li>
    <li>08</li>
    <li>09</li>
</ul>
<script>
 var ul = document.getElementsByTagName("ul")[0], li = ul.getElementsByTagName("li");
   for (; li[0] && ul.removeChild(li[0]); ); //удаляется только первый
  /*   var ul = document.querySelector("ul"), li = ul.querySelectorAll("li");
   for (var i=0, item; item = li[i]; i++)  {ul.removeChild(item)} //удаляются все по очереди   */
</script>

</body>
</html>

Последний раз редактировалось рони, 19.06.2017 в 01:14.
Ответить с цитированием
  #24 (permalink)  
Старый 19.06.2017, 01:15
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Т.е. через forEach.call - это более старый способ?
Насчёт последнего - спасибо, даже не подозревал о таком..
Ответить с цитированием
  #25 (permalink)  
Старый 19.06.2017, 01:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от Alessio18911
forEach.call - это более старый способ?
да
https://developer.mozilla.org/ru/docs/Web/API/NodeList

поддержка нового, по ссылке внизу (в ie нету)
https://developer.mozilla.org/en-US/...deList/forEach
Ответить с цитированием
  #26 (permalink)  
Старый 19.06.2017, 01:54
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Рони, и ещё: читаю тот пример ошибочного использования. Уже сломал голову - что значит строка:
divs[i].onclick = function(x) 
      {
          return function() 
          { 
                alert(x)
          }
       }(i)

Именно это i в конце! Каким боком оно к какой функции? Я только, конечно, начинаю влазить в JS, но не видел пока, чтобы то, что функция должна взять, стояло ЗА закрывающей скобкой...
Ответить с цитированием
  #27 (permalink)  
Старый 19.06.2017, 02:11
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Alessio18911, создаётся функция и тут же вызывается, в неё передаётся "i" в качестве параметра "x". Внутри возвращается ещё одна функция, которая и будет в onclick, но у неё ещё будет доступен параметр "x" из замыкания первой функции.
Ответить с цитированием
  #28 (permalink)  
Старый 19.06.2017, 02:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Alessio18911,
функция создаётся и тут же запускается с аргументом i и возвращает другую функцию, в которой это i сохраняется.
может, кто поможет, скажет как-то иначе ...
Ответить с цитированием
  #29 (permalink)  
Старый 19.06.2017, 11:08
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Рони, Ruslan_xDD, спасибо! С этим (i) разобрался - оказывается, так можно вызывать функцию. Но почитал на learn.javascript про замыкание, про порядок обработки кода и инициализации. Примеры же там, конечно, даются простенькие совсем, например, когда переменная инициализируется ДО выполнения какой-то функции и потом ей же присваивается другое значение. Тогда всё понятно - значение берётся текущее. Но ведь также сказано, что на этапе запуска происходит поиск и подготовка всех Function Declaration и всех переменных, которые становятся undefined. А вот потом, уже когда код выполняется, идёт присваивание:
var phrase = 'Привет';

function sayHi(name) {
  alert(phrase + ', ' + name);
}

sayHi('Вася');  // Привет, Вася (*)

phrase = 'Пока';

sayHi('Вася'); // Пока, Вася (**)

Здесь всё предельно ясно: перед запуском подготовлена sayHi(name); и 2 переменные: name и phrase, которые undefined. Когда функция запущена, происходит присвоение name = 'Вася'; а дальше ищется phrase, которая, находясь раньше функции, получает значение 'Привет'. Соответственно, когда функция вызвана второй раз, то "ближайшей" к ней phrase будет уже вторая, с 'Пока' поэтому результат её изменится.
Дальше возвращаемся к "ошибочному примеру". Там функция такова:
function addEvents(divs) {

    for(var i=0; i<divs.length; i++) {  

        divs[i].innerHTML = i

        divs[i].onclick = function() { alert(i) }

    }

}

Т.е. присвоение i значений же происходит последовательно, по мере того, как крутится цикл! Почему же тогда говорится, что "обработчик onclick активизируется, когда цикл закончен и i == 10;"?? Ведь
divs[i].onclick = function() { alert(i) }
расположен ВНУТРИ этого цикла, а не ЗА его пределами ниже! Почему тогда он берёт не текущую i, а финальную сразу? Или это свойство обработчика - активизироваться только после того, как отработает цикл, несмотря на то, что сам он находится внутри?

Последний раз редактировалось Alessio18911, 19.06.2017 в 11:17.
Ответить с цитированием
  #30 (permalink)  
Старый 19.06.2017, 11:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,129

Сообщение от Alessio18911
Почему тогда он берёт не текущую i, а финальную сразу?
потому что i на момент клика содержит финальное значение
Сообщение от Alessio18911
divs[i].onclick = function() { alert(i) //запросить i и вывести на экран}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как передать данные из json в названия параметров shultz1988 Общие вопросы Javascript 2 20.07.2011 11:15
Уникальность элементов в массиве - как? .andreev Общие вопросы Javascript 2 14.11.2010 15:03
Получение данных из тега в массиве, как? Madd Общие вопросы Javascript 37 06.07.2010 00:59
Как определить количество элементов в многомерном массиве Dima00782 Общие вопросы Javascript 3 12.06.2010 14:15
Как найти индекс по элементу в двумерном массиве? bayah Общие вопросы Javascript 5 22.04.2010 16:26