@dmitriyivvvv

Замыкания, return и ссылки на функцию?

Добрый день. Помогите разобраться почему происходит следующее при сравнение двух функций?
В данном случае возвращается false:
function foo() {
	var a = 2;

	function bar() {
		console.log( a );
	}

	return bar;
}

var baz = foo();

var bas = foo();

console.log(baz === bas);

А в этом true:
function foo() {
	var a = 2;

	function bar() {
		console.log( a );
	}

	return foo;
}

var baz = foo();

var bas = foo();

console.log(baz === bas);

Я так понимаю что в первом случае происходит копирование тела функции и соответственно ссылки на них не равны, а во втором случае возвращается ссылка на функцию и они равны?(Как я понял сравниваются же ссылки на объекты а не содержимое) Если можно объясните этот момент подробнее.
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
AngReload
@AngReload
Кратко о себе
Кратко.

В первом случае, функция создаёт и возвращает bar.
При каждом запуске происходит создание объекта bar. И при каждом запуске функции, она возвращает уникальную ссылку на уникальный объект.

Во втором случае, функция возвращает foo.
В коде функции нет объявления foo, а значит это переменная в лексическом окружении при создании функции.
Функция создаётся только один раз, значит и эта переменная будет одна и та же при каждом запуске.

Нужно знать, как работают объекты в js, чем отличаются от примитивных типов. Они не равны, даже если они имеют одинаковое содержимое, они все равно хранятся в разных областях памяти. Только примитивы в виде чисел \ строк \ null, undefined равны если их содержимое одинаково. Объекты не копируются при присвоении, только создаются ссылки на них.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Почитай про вслытие. В первом случае объект функции bar создаётся при выполнении функции foo, во втором ты передаешь объект уже созданной функции
Ответ написан
Ваш ответ на вопрос

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

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