Определение и вызов функции за один шаг

Есть ли способ в Javascript определить функцию и немедленно вызвать ее таким образом, чтобы ее можно было использовать повторно?

Я знаю, что вы можете выполнять одноразовые анонимные функции:

(function(i) {
    var product = i * i;
    console.log(product);
    // Can't recurse here because there's no (ECMA standard) way for the 
    // function to refer to itself
}(2)); // logs 4

Или вы можете назвать функцию, а затем вызвать ее позже:

function powers(i) {
    var product = i * i;
    console.log(i * i);
    if (product < 1e6) { powers(product) };
}

powers(2); // Logs 4, 16, 256...

Но есть ли более чистый способ определения и вызова функции за один раз? Что-то вроде гибрида обоих примеров?

Неспособность сделать это не мешает мне что-либо делать, но мне кажется, что это был бы хороший выразительный способ написать рекурсивные функции или функции, которые нужно запускать на $(document).ready(), а также позже, когда ситуация изменится и т. д.


person quis    schedule 21.09.2011    source источник
comment
Возможный дубликат Могу ли я назвать функцию javascript и выполнить ее немедленно?   -  person brichins    schedule 23.03.2017


Ответы (4)


Можешь попробовать:

(window.powers = function(i) {
  /*Code here*/
  alert('test : ' + i);
})(2);
<a href="#" onclick="powers(654)">Click</a>

Рабочая ссылка: http://jsfiddle.net/SqBp8/

Он вызывается при загрузке, и я добавил его в anchor tag для изменения параметра и alert.

person Marc Uberstein    schedule 21.09.2011
comment
Умное решение! Работает и без window., но явно подразумеваемые глобальные переменные - зло... - person quis; 21.09.2011
comment
Просто добавьте var powers; перед немедленно выполняемой функцией, и все готово. - person Yohaï-Eliel Berreby; 09.09.2014

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

> (function fac (n) {
    return (n === 0 ? 1 : n*fac(n-1));
  })(10)
3628800

Это стандартная функция (см. ECMA-262, изд. 5.1, стр. 98).

person Matthias Benkard    schedule 21.09.2011
comment
Это очень элегантно для того, что он делает. - person quis; 21.09.2011

Все ответы здесь близки к тому, что вы хотите, но имеют несколько проблем (добавление его в глобальную область, фактически не вызывая его и т. д.). Это объединяет несколько примеров на этой странице (хотя, к сожалению, вам нужно помнить arguments.callee):

var test = (function() {
  alert('hi');
  return arguments.callee;
})();

Позже вы можете назвать это:

test();
person gkoberger    schedule 28.05.2014
comment
Единственная проблема заключается в том, что arguments.callee устарел. и выдает ошибку на ES5 в строгом режиме. - person Tivie; 02.07.2014
comment
@Tivie Но вы можете назвать анонимную функцию. var test = (function fn() { alert('hi'); return fn; })(); - person Evan Kennedy; 04.08.2015

Если вас не волнует возвращаемое значение, вы можете сделать это.

var powers = function powers(i) {
    var product = i * i;
    console.log(i * i);
    if (product < 1e6) { powers(product) };
    return powers;
}(2);
person twhb    schedule 03.06.2014