самопризывающие функции - PullRequest
4 голосов
/ 03 марта 2009

когда я кодирую:

var a =
function()
{
    alert("44")
    return function(){alert(33)}
}()();

вычисляется ли это выражение в следующем порядке?

  1. определить функцию;
  2. передает свой ссылочный указатель на
  3. a () вызывается
  4. возврат в новом указателе функции
  5. a () вызывается снова

и если да, то почему у меня возникает синтаксическая ошибка, если я делаю:

function()
{
    alert("44")
    return function(){alert(33)}
}();

интерпретатор сначала хочет левый операнд ...

но этот синтаксис работает:

(
  function()
  {
    alert("44")
    return function(){alert(33)}
  };

)()

внешняя скобка, что означает ???

Спасибо

Ответы [ 3 ]

3 голосов
/ 03 марта 2009

Это синтаксис языка. Если вы хотите выполнить анонимную функцию на месте, вы должны заключить ее в скобки.

JS имеет такие крайние случаи, когда синтаксис более странный, чем вы ожидаете. Возьмем, к примеру, подтверждение строки, содержащей JSON, не сработает, если она не обернута в скобки.

// Wrong
eval("{ ... }");
// Right
eval("({ ... })");

Это синтаксис языка.

Тем не менее, я думаю (и это строго ИМХО), описанные вами шаги не точны.

  1. Функция определена и вызвана. предупреждение ( "44"); происходит в результате.
  2. Функция возвращает другую функцию, которая также вызывается. оповещение ( "33"); случается.
  3. Самая внутренняя функция ничего не возвращает, поэтому она фактически не определена. typeof возвращает "undefined".
3 голосов
/ 03 марта 2009
  1. function() { alert("44") return function(){alert(33)} } Вы определяете функцию
  2. function() { alert("44") return function(){alert(33)} }() Вы вызываете эту функцию, возвращая анонимную функцию function(){alert(33)}
  3. function() { alert("44") return function(){alert(33)} }()() вы вызываете возвращаемую функцию, так что на самом деле это эквивалентно function(){alert(33)}()

Таким образом, все выполнение эквивалентно:

alert("44"); alert(33);
0 голосов
/ 01 февраля 2013

Я также изучаю функции самовоспроизведения.
и я думаю, что код должен быть 3. (function() { alert("44"); return function(){alert(33);} })()()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...