Почему консоль выдает ошибку 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 одинаковых