Задать вопрос
  • Почему консоль выдает ошибку в callback ф-ии?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Почему консоль выдает ошибку Uncaught ReferenceError: arr is not defined?

    А почему не должно?

    function f1(myFunc) {
       myFunc(arr, block);
    }
    
    function showArr(arr, block) {
       arr[3] = arr[3] * 10;
       block.innerHTML = arr.join('_');
    }
    
    f1(showArr(arr1, out1))

    Вы в f1 тут не функцию передаёте, а результат её работы, то есть undefined. Потому что если после названия функции есть круглые скобки, то сначала эта функция вызовется, отработает, и будет использован результат её выполнения. Так как явного return нет, то showArr вернёт undefined. Таким образом эта запись:
    f1(showArr(arr1, out1)) эквивалентна этой: f1(undefined) С той лишь разницей, что выполнится код внутри showArr..

    Но так как код выполняются справа налево, то внутри f1() не успевает дойти до ошибки undefined is not a function потому что внутри f1() сначала пытается найти переменную arr. А откуда ей там взяться? Её нет ни в аргументах функции f1(), ни в вышестоящей области видимости, так как там arr1.

    Ну а во втором примере Вы как раз передаёте функцию как аргумент, по ссылке, не вызывая её f1(showArr, arr1, out1); Поэтому ошибку не выдаёт.

    почему третий элемент массива сохраняет условия и остается 40, хотя в условии я поставил задачу только для четвертого элемента массива?

    Опять же, а почему не должно? Вы изменяете массив arr1 по ссылке. То есть один и тот же массив изменяется и в showArr и в showArr2.
    function showArr(arr, block) { // arr = [1, 2, 3, 4, 5, 6, 7, 8]
       arr[3] = arr[3] * 10; // поменяли 4ый элемент, массив стал равен [1, 2, 3, 40, 5, 6, 7, 8]
    }
    
    function showArr2(arr, block) { // arr = [1, 2, 3, 40, 5, 6, 7, 8]
       arr[4] = arr[4] * 100; // поменяли 5ый элемент, массив стал равен [1, 2, 3, 40, 500, 6, 7, 8]
    }
    
    f1(showArr, arr1, out1); // и тут
    f1(showArr2, arr1, out2); // и тут Вы передаёте один и тот же массив. Массив это ссылочный тип данных. В обоих обработчиках будет один и тот же массив, а не 2 одинаковых
    Ответ написан
    4 комментария
  • Как правильно задать условия проверки для последнего элемента массива?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    lastEl - это индекс эемента, а не сам элемент. Сам элемент - friends[lastEl ]
    Ответ написан
    Комментировать
  • Грамотно ли написан код?

    @StiflerProger
    В вашем коде от цикла нет смысла, если без цикла просто
    document.write(week.slice(0,-2).join(',') + ',' + week.slice(-2).join(',').bold());

    то код хороший
    в цикле надо перебирать по одному дню и выводить
    const week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
    
    for (let i = 0; i < week.length; i++) {
      if (week[i] === 'Суббота' || week[i] === 'Воскресенье') {
        document.write(week[i].bold());
      } else {
        document.write(week[i]);
      }
    }

    чтобы не сравнивать выходные по названию, можно вместо строк использовать объекты
    const week = [{title: 'Понедельник', weekend: false}, ... {title: 'Воскресенье', weekend: true}];
    
    for (let i = 0; i < week.length; i++) {
      document.write(week[i].weekend ? week[i].title.bold() : week[i].title);
    }
    Ответ написан
    3 комментария
  • Как метод filter работает с includes в этом коде?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    arr.filter() будет передавать по очереди каждое из чисел массива arr в функцию,
    и оставит в выходном массиве только те числа, для которых функция вернула true. См. документацию Array.prototype.filter()

    Функция должна вернуть true для чисел, у которых первая цифра 1, 2 или 5.

    Один из способов – сделать из числа текстовую строку, и взять её первый символ. Т.е. первую цифру, тоже как текст.

    К строке текста в JavaScript можно обращаться как к массиву – забирая по индексу одну из букв:
    "Habr"[0] // "H" вот тут такой вариант и используют.

    Метод startsWith() — метод строки. Есть только у строки. Тоже годится для получения из строки текста первого символа. Но [0] короче.
    Ответ написан
    3 комментария