web-dev-qa-db-ja.com

ワンステップで関数を定義して呼び出す

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()で実行する必要がある関数を記述するためのニースの表現力のある方法であるように感じます変更など.

48
quis

あなたが試すことができます:

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

ワーキングリンク: http://jsfiddle.net/SqBp8/

ロード時に呼び出され、パラメータとalertを変更するために_anchor tag_に追加しました。

48
Marc Uberstein

必要なのがそれ自体の本体内で関数にアクセスする場合、functionキーワードの後に​​名前を指定するだけです:

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

これは標準機能です( ECMA-262 、ed。5.1、p。98を参照)。

30

ここでのすべての答えはあなたが望むものに近いですが、いくつかの問題があります(実際にそれを呼び出すのではなく、グローバルスコープに追加するなど)。これは、このページのいくつかの例を組み合わせたものです(残念ながら、arguments.callee):

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

後で、あなたはそれを呼び出すことができます:

test();
10
gkoberger

戻り値を気にしない場合は、これを行うことができます。

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