Подтвердить что ты не робот

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

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

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

(function(i) {
    var product = i * i;
    console.log(product);
    // Can't recurse here because there 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(), но также и позже, когда ситуация меняется, и т.д.

4b9b3361

Ответ 1

Вы можете попробовать:

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

Ответ 2

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

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

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

Ответ 3

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

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

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

test();

Ответ 4

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

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