Вопрос проверяет, понимаешь ли ты разницу между изменением параметра и изменением исходной переменной, а также идею локальной области видимости.
Потому что внутри функции ты меняешь не внешнюю переменную, а локальный параметр, который содержит копию значения. Примитив нельзя “изменить внутри” — можно только присвоить новое значение переменной. Когда ты делаешь x = ..., ты переприсваиваешь параметр x, а не исходную переменную. Поэтому снаружи ничего не меняется.
Тут важно различать два действия: изменить значение переменной и попытаться изменить “сам примитив”. Примитивы не имеют “внутреннего состояния”, которое можно мутировать — у них есть только значение, и переменная может указывать на одно значение или на другое.
Определение: Переприсваивание (reassignment) — это когда переменной дают новое значение, и она начинает хранить его вместо старого.
function setZero(x) {
x = 0;
}
let n = 5;
setZero(n);
console.log(n); // 5
Что произошло:
В setZero(n) вычислилось значение n (это 5).
Параметр x получил копию 5.
x = 0 изменил только локальную переменную x.
Переменная n вне функции не трогалась.
У функции нет доступа к самой переменной n, она видит только значение, переданное при вызове.
Чтобы изменить внешнюю переменную, нужно:
вернуть новое значение и присвоить его снаружи, или
менять объект (если передан объект), или
использовать замыкание (если это переменная из внешнего scope, а не аргумент).
Пример с возвратом:
function setZero(x) {
return 0;
}
let n = 5;
n = setZero(n);
console.log(n); // 0
такие функции легче тестировать
меньше “скрытых” побочных эффектов
проще поддерживать код в больших проектах
Вывод: изменение примитива “внутри функции” на самом деле является переприсваиванием локального параметра, поэтому внешняя переменная не меняется.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию