[解決済み] JavaScriptの関数が受け取ることのできる引数の最大数はありますか?
質問
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 の引数です。その後、それはで失敗しました。
メモリ不足のため、スクリプトを終了しました。
関連
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] JavaScriptでクエリ文字列の値を取得するにはどうすればよいですか?
-
[解決済み] JavaScriptでカンマを桁区切りにして数値を表示する方法
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] 各オブジェクトに?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み】JavaScriptの配列に含まれる最大の数を見つけるにはどうすればよいですか?
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] これは純関数ですか?