@Drovosek01

Как работает это присвоение?

Смотрю видео про замыкания. Там представлен такой код:
var getAnswer = (function() {
	var answer = 42;

	return function inner() {
		return answer++;
	};
}());

В переменную getAnswer записывается результат выполнения анонимной функции. Т.е. переменной getAnswer присваивается функция (или ссылка на функцию) inner и getAnswer сама становится этой функцией.

Меня смутила последняя строка. Почему открывающаяся и закрывающаяся скобка идут сразу после фигурной? Вроде "правильней", чтобы эта анонимная функция сразу вызвалась надо обернуть эту функцию в круглые скобки (что собственно и сделано) и после них уже написать скобки с аргументами.
Тут же скобки с аргументами идут внутри других скобок. Почему так?
  • Вопрос задан
  • 182 просмотра
Решения вопроса 2
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Можно и так
(function() {
  var answer = 42;

  return function inner() {
    return answer++;
  };
})();

Скобки ставятся для того, чтобы интерпретатор понимал, что это функциональное выражение, а не просто функция.
В вашем же примере, это и так стало понятно из-за присваивания функции в переменную. т.е. можно писать и так
var getAnswer = function() {
  var answer = 42;

  return function inner() {
    return answer++;
  };
}();

но нельзя так
function() {
  var answer = 42;

  return function inner() {
    return answer++;
  };
}();

потому, что тут уже почти обычное определение функции, это не выражение. Поэтому люди и добавляют скобки, чтобы было выражение, и тогда уже можно сразу вызвать функцию.

По этой теме мне нравится пример с объектами.

{} + 2; // 2
2 + {}; // 2[object Object]

в первом случае, чтение идет слева направо, и интерпретатор попадает на {}, что не похоже на выражение, а значит это не объект а просто блок кода. Далее идет унарный оператор + и число, выходит +2.
Во втором случае, первым идет число а далее оператор, значит это уже выражение, и фигурные скобки будут поняты как часть выражения, а значит это объект.
Такой пример дает понимание работы интерпретатора, и поможет вам разобраться с вашей ситуацией.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
getAnswer сама становится этой функцией
Не становится. В переменной getAnswer ссылка на функцию inner. Можно туда и что-то другое записать, вместо функции.

var getAnswer = function() {
  var answer = 42;

  return function inner() {
    return answer++;
  };
}();

var anotherAnswer = getAnswer
getAnswer = -Infinity

dVxlVo.png

Трюк со скобками - одна из форм записи самовызывающихся функций, они-же self-invoking functions или функциональные выражения. Делается для того, чтобы интерпретатор понял, что это не просто объявление функции, но ее еще и выполнить надо.

Форм записи у этого трюка не одна и не две.
Можно даже вот так: +function(){console.log('foo')}()
Здесь унарный плюс заставляет выполнить следующую за ним строку. (но не делайте так, те кто будут это читать вас проклянут)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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