@AlbertP1207

Как работает этот код?

var q = (function(x,foo = () => x) {
var x;
var y = x;
x =3;

return [x,y,foo()];
})(2)
console.log(q) // [3,2,2]

почему foo() возвращает 2, а не 3 ?
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
Чтобы понять, что происходит, нужно просто посмотреть. Например, так:
Пример
var q = (function(x,foo = () => x) {
	console.log('a)',x,y,foo()); //2 undefined 2
	var x;
	console.log('b)',x,y,foo()); //2 undefined 2
	var y = x;
	console.log('c)',x,y,foo()); //2 2 2
	x =3;
	console.log('d)',x,y,foo()); //3 2 2
	return [x,y,foo()];
})(2)
console.log(q) // [3,2,2]
Более подробный пример
var q = (console.log('init q',typeof x), //init q undefined
	function(x,foo = (console.log('init foo',x),() => x)) { //init foo 2
		console.log('a)',x,y,foo()); //2 undefined 2
		var x;
		console.log('b)',x,y,foo()); //2 undefined 2
		var y = x;
		console.log('c)',x,y,foo()); //2 2 2
		x =3;
		console.log('d)',x,y,foo()); //3 2 2
		return [x,y,foo()];
	}
)(2)
console.log(q) // [3,2,2]

В общем, там на момент инициализации функции foo видна область видимости анонимной функции. Но этих локальных областей видимости у анонимной функции как бы две на самом деле. Первая содержит параметры функции, а вторая - уже локальные переменные функции. И вот эта var x сидит во второй и перекрывает первую область видимости. То есть foo не видит var x, а видит только тот x, который в параметрах, потому что сама foo тоже сидит в первой области видимости. Надеюсь, доступно.
Ответ написан
Комментировать
Все дело в объявлении переменных.
var объявляет переменную X внутри всей области видимости функции, в то время, как функция обращается к X внутри области видимости блока фигурных скобок {}.

let-const-var;
области видимости;
Ответ написан
Ваш ответ на вопрос

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

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