Определение и вызов функции за один шаг - PullRequest
48 голосов
/ 21 сентября 2011

Есть ли способ в 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(), но также позже, когда ситуация меняется и т. д.

Ответы [ 4 ]

48 голосов
/ 21 сентября 2011

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

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

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

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

28 голосов
/ 21 сентября 2011

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

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

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

10 голосов
/ 29 мая 2014

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

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

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

test();
5 голосов
/ 03 июня 2014

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

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