@Lolipop999

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

Почему консоль выдает ошибку Uncaught ReferenceError: arr is not defined?
<div class="out-1"></div>
<div class="out-2"></div>
<div class="out-3"></div>

let arr1 = [1, 2, 3, 4, 5, 6, 7, 8];
let out1 = document.querySelector('.out-1');
let out2 = document.querySelector('.out-2');
let out3 = document.querySelector('.out-3');

function f1(myFunc) {
   myFunc(arr, block);
}

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

f1(showArr(arr1, out1))


А при таком написании не выдает ошибку, НО при выводе в блок out2 почему третий элемент массива сохраняет условия и остается 40, хотя в условии я поставил задачу только для четвертого элемента массива?

function f1(myFunc, arr, block) {
   myFunc(arr, block);
}

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

function showArr2(arr, block) {
   arr[4] = arr[4] * 100;
   block.innerHTML = arr.join(' ');
}

f1(showArr, arr1, out1);
f1(showArr2, arr1, out2);
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
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 одинаковых
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы