Инкремент и hoisting var
Задача
Что будет в консоли и почему?
'use strict';
var x = 5;
console.log(++x); // ?
console.log(x++); // ?
fn();
console.log(x); // ?
function fn() {
console.log(x); // ?
x += 10;
console.log(x); // ?
console.log(typeof x); // ?
var x = 3;
console.log(x); // ?
}Ответ
6 6 undefined NaN number 3 7
Разбор
Пошаговый разбор
Шаг Что происходит Вывод ++xПре-инкремент: xстановится6, возвращается новое значение6x++Пост-инкремент: возвращается 6, затемxстановится76fn()входВнутри fnестьvar x→ он всплывает (hoisting), локальныйx=undefined— console.log(x)Читается локальный x, ещё не присвоенundefinedx += 10undefined + 10→NaN— console.log(x)Локальный xтеперьNaNNaNtypeof xNaN— это значение типа numbernumbervar x = 3Присваивание локальному x— console.log(x)Локальный x3console.log(x)(снаружи)Внешний xне менялся внутриfn— там свой скоуп7
Ключевая идея
var xвнутриfnвсплывает в начало функции, поэтому внутренние обращения кxотносятся к локальной переменной, а не к внешней. Внешнийxостаётся7.