ddimonn8080
@ddimonn8080

Почему такая конструкция функции работает?

Здравствуйте, изучая чужой код нашел такую конструкцию:
function x (n) {
    return (Function)('n', 'return n;')(n);
}

var result = x(1);


Почему это работает? Вернее каким образом? Можно обойтись без фигурных скобок?
  • Вопрос задан
  • 169 просмотров
Решения вопроса 3
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Ничего сложного, на самом деле: при вызове x создаётся анонимная функция, которая сразу же выполняется с аргументом, переданным в x.

(Function)('n', 'return n;')(n)
эквивалентно этому:
new Function('n', 'return n;')(n)
и вот этому:
(function (a) {return a;})(n)

Документация по объекту Function.
Ответ написан
keslo
@keslo
Тут получается работа с замыканиями:
(Function) /* вызывается с параметрами */ ('n', 'return n;')
(Function)('n', 'return n;')  /* вызывается в свою очередь с */ (n)

/* Запись */ (Function) /* эквивалетна */ new Function
Ответ написан
Комментировать
mannaro
@mannaro Куратор тега JavaScript
Умею профессионально гуглить
Это какое-то дикое определение фабрики. Точнее, недофабрики. Код, эквивалентный этому:
function x(n) {
  var fn = function(n) { return n };
  return fn(n);
}

// после упрощения
function y(n) {
  return n;
}
var result = x(1);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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