Самовозвратная функция JavaScript - PullRequest
1 голос
/ 20 марта 2011

Я получил этот пример на странице 79 книги Стояна Стефанова «Объектно-ориентированный JavaScript».Не зная, что делать, в первый раз, когда я запустил эту программу (нажав Enter), она вернула «undefined».После этого, следуя инструкциям автора, я назвал его a(); и получил предупреждение «Трудолюбивый»

Мои вопросы

a) Правильно ли я сделал первый шаг?то есть я должен запускать самопризывающую программу, просто нажимая «ввод / возврат»?

б) если я был прав, просто нажав «enter / return» для запуска программы, почему он дал результат «undefined».Автор этой программы, по словам автора, повторно возвращает ссылку (при первом прогоне) на функцию actualWork ()?если он возвращает ссылку, почему это считается неопределенным?Это как-то важно?

Обратите внимание, что я попытался ввести код в jsfiddle.net, а затем нажал "выполнить", и ничего не произошло, но я получил "неопределенный", когда я запускал его в первый раз в консоли, а затемпредупреждение потом, когда я сделал ();

var a = function() {
    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
}();

Ответы [ 5 ]

4 голосов
/ 20 марта 2011

«Самовывоз» означает, что этот код имеет немедленный эффект сразу после его выполнения компилятором, , даже если весь код находится внутри функции . Это происходит потому, что функция вызывается немедленно (те () в последней строке).

Это также случилось бы, если бы вы написали просто

function someSetup(){
    var setup = 'done';
}
function actualWork(){
    alert('Worky-worky');
}
someSetup();
return actualWork;

Разница здесь в том, что «самовозглашающаяся программа» (которая является плохим описанием того, чем она является, ИМХО) позволяет вам делать это, не делая имена someSetup и actualWork видимыми для вызывающего кода - - это обычно желательно.

Объяснив это, давайте ответим на ваши вопросы:

  1. Фрагмент кода сам по себе return ничего не делает (даже если он присваивает a то, что является , возвращаемым функцией); поэтому ваша JS IDE сообщает, что его возвращаемое значение равно undefined.
  2. Ссылка на функцию actualWork возвращается нормально (это значение, присвоенное a); Вы видели это сами, когда успешно назвали это с a().
4 голосов
/ 20 марта 2011

Этот код эквивалентен:

var f = function() {
    function someSetup(){
        var setup = 'done';
    }
    function actualWork(){
        alert('Worky-worky');
    }
    someSetup();
    return actualWork;
};

var a = f();

Итак: вы создаете переменную f и назначаете ей функцию.Затем Вы присваиваете результат вызова f() для a, что также является функцией (это делается неявно в исходном коде).И в самом конце вы можете запустить a(), который запускает функцию , возвращаемую на f().

2 голосов
/ 20 марта 2011

a) в зависимости от того, как работает ваш интерпретатор, да, просто запуск скрипта (нажатием клавиши return) определяет функцию a ();

b) она выдала «undefined», потому что сама программа не возвращаетчто угодно, кроме функции a ();делает.код, который вы цитировали выше, представляет собой функцию a ();который при вызове должен выполнить следующее:

  1. определить 2 другие (временные) функции
  2. запустить одну из них (someSetup)
  3. вернуть другую.

, поэтому я бы использовал программу следующим образом:

  1. , выполняющийся для определения ();
  2. , вызывающий var x=a();
  3. (необязательно) проверка, если setup=='done'
  4. вызов x(); (который был возвращен ()) должен показать предупреждение.

РЕДАКТИРОВАТЬ извините, яне видел} ();в конце, так что это не на 100% правильно.();в конце - как сказали оба Джона и Томаша - краткая форма для «взять возвращаемое значение функции как новую функцию и немедленно запустить ее».

1 голос
/ 20 марта 2011

Анонимная функция вызывается немедленно и возвращает ссылку на функцию actualWork внутри нее.Таким образом, a содержит эту ссылку и может быть вызван сам по себе.Так что a(); должен дать вам предупреждение.

1 голос
/ 20 марта 2011

undefinded возвращается из операторов var a = ..., что в порядке.Ссылка возвращается с правой стороны присвоения.

...