Ответ 1
Вы можете попробовать:
(window.powers = function(i) {
/*Code here*/
alert('test : ' + i);
})(2);
<a href="#" onclick="powers(654)">Click</a>
Есть ли способ в 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()
, но также и позже, когда ситуация меняется, и т.д.
Вы можете попробовать:
(window.powers = function(i) {
/*Code here*/
alert('test : ' + i);
})(2);
<a href="#" onclick="powers(654)">Click</a>
Если вы хотите получить доступ к функции внутри своего тела, вы можете просто указать имя после ключевого слова function
:
> (function fac (n) {
return (n === 0 ? 1 : n*fac(n-1));
})(10)
3628800
Это стандартная функция (см. ECMA-262, под ред. 5.1, стр. 98).
Все ответы здесь близки к тому, что вы хотите, но имеете несколько проблем (добавив их в глобальную область, а не называя ее и т.д.). Это объединяет несколько примеров на этой странице (хотя, к сожалению, вам нужно запомнить arguments.callee
):
var test = (function() {
alert('hi');
return arguments.callee;
})();
Позже вы можете назвать это:
test();
Если вы не заботитесь о возвращаемом значении, вы можете сделать это.
var powers = function powers(i) {
var product = i * i;
console.log(i * i);
if (product < 1e6) { powers(product) };
return powers;
}(2);