62

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

4 回答 4

56

你可以试试:

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

工作链接:http: //jsfiddle.net/SqBp8/

它在加载时被调用,我已将其添加到 ananchor tag以更改参数和alert.

于 2011-09-21T11:26:44.817 回答
40

如果您只想在其自身的主体中访问该函数,您可以简单地在function关键字后指定一个名称:

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

这是一项标准功能(参见ECMA-262,第 5.1 版,第 98 页)。

于 2011-09-21T13:05:46.767 回答
12

这里的所有答案都接近您想要的,但有一些问题(将其添加到全局范围,而不是实际调用它等)。这结合了此页面上的一些示例(尽管不幸的是它需要您记住arguments.callee):

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

稍后,您可以调用它:

test();
于 2014-05-28T21:28:34.613 回答
6

如果你不关心返回值,你可以这样做。

var powers = function powers(i) {
    var product = i * i;
    console.log(i * i);
    if (product < 1e6) { powers(product) };
    return powers;
}(2);
于 2014-06-03T01:42:24.190 回答