1. ホーム
  2. javascript

[解決済み] JavaScriptの関数が受け取ることのできる引数の最大数はありますか?

2023-05-27 13:29:48

質問

JavaScriptの関数が引数をいくつでも受け取れることは知っています。

function f(){};
f(1,2,3,4 /*...*/);

しかし、実際に "any" の数には制限があるのでしょうかね?

例えば、私が100万個の引数を f() . これはうまくいくでしょうか?それともインタープリタが倒れてしまうのでしょうか?

最大値は、(a)実装に依存するか、(b)のどちらかだと思います。 (2^32)-1 であることから arguments オブジェクトは配列のようなものだからです。

言語仕様には記載がないのですが、何か点と点を結んでいないのかもしれません。

どのように解決するのですか?

を制限するものは特にありませんが 理論的な のような)仕様上の最大引数数を制限するものはありませんが thefortheye の回答 が指摘しています)。そこにはもちろん 実用的な の限界もあります。この限界は完全に実装に依存し、また、ほとんどの場合、次のものに正確に依存するでしょう。 どのように に依存します。


私が作成した このフィドル を実験的に作ってみました。

function testArgs() {
    console.log(arguments.length);
}

var argLen = 0;
for (var i = 1; i < 32; i++) {
    argLen = (argLen << 1) + 1;
    testArgs.apply(null, new Array(argLen));
}

以下は私の結果です。

  • Chrome 33.0.1750.154 m: 最後に成功したテストは次のとおりです。 65535 の引数です。その後、それはで失敗しました。

    Uncaught RangeError: 最大呼び出しスタックサイズを超えました

  • Firefox 27.0.1: 最後に成功したテストは 262143 の引数で失敗しました。その後、それはで失敗しました。

    RangeError: Function.prototype.apply に渡された引数配列が大きすぎます。

  • Internet Explorer 11: 最後に成功したテストは 131071 の引数で失敗しました。その後、それはで失敗しました。

    RangeError: SCRIPT28:スタック容量が不足しています。

  • Opera 12.17: 最後に成功したテストは 1048576 の引数でした。その後、それはで失敗しました。

    エラーです。Function.prototype.apply: argArray is too large.

もちろん、ここには他の要因があるかもしれませんし、違う結果が出るかもしれません。


そして、これは 代替バイオリン を使って作成した eval . ここでも、異なる結果が得られるかもしれません。

  • Chrome 33.0.1750.154 m: 最後に成功したテストは 32767 の引数です。その後、それはで失敗しました。

    Uncaught SyntaxError: 関数呼び出しの引数が多すぎます (32766個しか許可されません)

    これは特に興味深いもので、Chrome 自体が、実際に許可される引数の数について混乱しているようです。

  • Firefox 27.0.1: 最後に成功したテストは 32767 の引数で失敗しました。その後、それはで失敗しました。

    スクリプトが大きすぎます。

  • Internet Explorer 11: 最後に成功したテストは 32767 の引数で失敗しました。その後、それはで失敗しました。

    RangeError: SCRIPT7: Out of memory

  • Opera 12.17: 最後に成功したテストは 4194303 の引数です。その後、それはで失敗しました。

    メモリ不足のため、スクリプトを終了しました。