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()
上运行的递归函数或函数,但后来当情况变化等等。
答案 0 :(得分:48)
您可以尝试:
(window.powers = function(i) {
/*Code here*/
alert('test : ' + i);
})(2);
<a href="#" onclick="powers(654)">Click</a>
工作链接:http://jsfiddle.net/SqBp8/
它会在加载时调用,我已将其添加到anchor tag
以更改参数alert
。
答案 1 :(得分:28)
如果你想要的只是在自己的身体中访问该功能,你只需在function
关键字后指定一个名称:
> (function fac (n) {
return (n === 0 ? 1 : n*fac(n-1));
})(10)
3628800
这是标准功能(参见ECMA-262,编辑5.1,第98页)。
答案 2 :(得分:10)
这里的所有答案都接近您想要的,但有一些问题(将其添加到全局范围,而不是实际调用它等)。这结合了此页面上的一些示例(尽管不幸的是,您需要记住arguments.callee
):
var test = (function() {
alert('hi');
return arguments.callee;
})();
稍后,您可以调用它:
test();
答案 3 :(得分:5)
如果您不关心返回值,可以这样做。
var powers = function powers(i) {
var product = i * i;
console.log(i * i);
if (product < 1e6) { powers(product) };
return powers;
}(2);