@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, во втором ты передаешь объект уже созданной функции
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы