Est-il un nombre max d'arguments des fonctions JavaScript peut accepter?
Je sais que des fonctions JavaScript peut accepter "tout" nombre d'arguments.
function f(){};
f(1,2,3,4 /*...*/);
Mais je me demandais si il n'y a effectivement une limite au nombre de "tout" peut être?
E. g., disons que j'ai la main un million d'arguments pour f()
. Cela fonctionnerait-il? Ou serait l'interprète de quille sur?
Je devine que le maximum soit (un) la mise en œuvre spécifique ou (b) (2^32)-1
, depuis le arguments
objet est semblable au tableau.
Je ne la vois pas mentionnées dans la spécification du langage, mais je ne pourrais pas être de la connexion de certains points.
- J'espère vraiment que c'est purement de la curiosité, non pas parce que vous prévoyez de faire quelque chose avec cela.
- Aussi, TOUTE grande séquence de données comme cela devrait être passé comme un seul argument qui est un tableau, et non pas en tant que distincts des arguments si une copie n'a pas besoin d'être à la vaste ensemble de données juste pour appeler la fonction. Ce doit être un exercice académique, pas quelque chose qui pourrait être rencontrés avec les bonnes pratiques de développement.
- Oui, juste par curiosité 🙂
- n'oubliez pas
Function.prototype.apply
. stackoverflow.com/questions/1379553/... - Je sais que sur
.apply()
, mais c'est faire une copie du tableau d'entrée trop. Le point est que toute l'interface qui s'attend à accepter un très grand nombre d'arguments ne devrait pas être déclaré pour les obliger à être passé sous la normale arguments. Beaucoup plus efficace pour passer un tableau donc pas de copie des données est nécessaire. - Ce n'est pas une question théorique! Même si vous n'avez jamais écrire explicitement une telle fonction, si vous utilisez l'ES 2015 la propagation de l'opérateur et des fonctions comme
Math.max
ouArray.prototype.concat(...arrayOfArrays)
(pour aplatir un tableau de tableaux), vous pouvez obtenir à cette limite de façon dynamique, sans avoir écrit un monstre de la fonction. Les frais généraux mentionnés par jfriend00 n'est pas toujours question - la clarté de code est plus important que quelques octets de mémoire ou de cycles de PROCESSEUR, et de la propagation de la syntaxe peut parfois être le meilleur choix en la matière. Rechercher des alternatives pour "aplatir tableau" de mon code court... - Mon commentaire est à partir de Mars 2014. ES5015 n'a pas été publié jusqu'en juin 2015.
- Je comprends que, et j'ai fait le commentaire maintenant parce que c'est pertinent. DONC, les réponses et les commentaires ne sont pas seulement pour les personnes qui posté le 🙂
- Les aplatir tableau de tableaux de cas est là que j'ai rencontré ce problème aussi!
Vous devez vous connecter pour publier un commentaire.
Bien qu'il n'y a rien de spécifique à la limitation de la théorique nombre maximal d'arguments dans la spec (comme thefortheye's réponse souligne). Il y a bien sûr pratique limites. Ces limites sont entièrement dépendant de l'implémentation et le plus probable, sera également dépendre exactement sur comment vous êtes à l'appel de la fonction.
J'ai créé ce violon comme une expérience.
Voici mes résultats:
Chrome 33.0.1750.154 m: Le dernier test réussi, a été 65535 arguments. Après qu'il a échoué avec:
Firefox 27.0.1: Le dernier test réussi, a été 262143 arguments. Après qu'il a échoué avec:
Internet Explorer 11: Le dernier test réussi, a été 131071 arguments. Après qu'il a échoué avec:
Opera 12.17: Le dernier test réussi, a été 1048576 arguments. Après qu'il a échoué avec:
Bien sûr, il peut y avoir d'autres facteurs en jeu ici, et vous pouvez avoir des résultats différents.
Et voici un suppléant de violon créé à l'aide de
eval
. Encore une fois, vous pouvez obtenir des résultats différents.Chrome 33.0.1750.154 m: Le dernier test réussi, a été 32767 arguments. Après qu'il a échoué avec:
celui-ci est particulièrement intéressant parce que Chrome semble elle-même être confus quant à la façon dont de nombreux arguments sont effectivement autorisés.
Firefox 27.0.1: Le dernier test réussi, a été 32767 arguments. Après qu'il a échoué avec:
Internet Explorer 11: Le dernier test réussi, a été 32767 arguments. Après qu'il a échoué avec:
Opera 12.17: Le dernier test réussi, a été 4194303 arguments. Après qu'il a échoué avec:
apply
et de l'envoi des arguments comme unArray
, l'théorique max par la spec serait 4,294,967,295 éléments peu importe ce que les limites pratiques sont (?)..apply()
plus que les arguments de la fonction ignoré, comme montré dans la question. Ils ne sont pas nécessairement les mêmes. Voici une démo où j'ai créé une fonction à partir d'une chaîne à l'aide de laFunction
constructeur. La fonction appelle votretestArgs()
fonction, passant de 100 000 arguments. Le simple fait de créer cette fonction échoue avecSyntaxError: too many function arguments
.apply()
semble plus probable. Mais alors il ne mentionne pas.apply()
, donc peut-être qu'il a l'intention de faire uneeval
ing.ECMAScript 5.1, partie de 8,8
Donc il n'y a pas de limite dans la norme. Bien sûr, si votre code fonctionne dans le monde réel, pas dans les normes-terre, il y a évidemment certains limite (par exemple le nombre de particules dans l'univers).
Il y a deux façons de passer des paramètres à une fonction.
f(a, b, c)
f.apply(null, [a, b, c])
Cette dernière méthode est le scénario plus réaliste pour les grandes listes d'arguments.
Aller à ce JSFiddle à voir les limites de chacune de ces pour votre navigateur actuel.
J'ai essayé un peu de navigateurs moi-même:
J'ai vu des différences dans le nombre de ces numéros sur des machines différentes, donc je crois qu'il y a d'autres facteurs en jeu, outre le navigateur (l'OS?).
C'est une vraie question, pas certains de trivia. Un exemple réel:
Google Fermeture de la Bibliothèque défini la fonction suivante.
Cela a fonctionné seulement si la longueur de la chaîne est dans le navigateur de limite pour le nombre d'arguments peuvent être passés avec
Function.prototype.apply
.La fonction a été plus tard patché, faisant la fonction de beaucoup plus compliqué.
Pour info, il y a un Webkit problème déposé en Mars 2012, qui traite de l'argument de la limite.
Selon ECMA Script 5.1 Spécification Standard pour
List
,Ainsi, la norme n'ont pas de limitations sur le nombre d'arguments et limitée que par la mémoire.
> à partir de Ordinateur Conneries
Autant que je suis concerné, la limite est "assez grand"!
C'est purement dépend de combien puissant est le client.
Parce que le navigateur va perdre sa mémoire, si tu vas en passer des millions d'arguments.
Chaque variable contient de la mémoire. Afin que les navigateurs n'auront aucun problème à l'allocation de chaque variable de la mémoire, jusqu'à ce qu'il n'a pas de mémoire pour exécuter sur.
Ici est de savoir comment je le vérifie.
Selon le MDN, la Fonction JavaScript de la section, le montant maximum de paramètres d'une fonction peut accepter est Deux cent cinquante cinq.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Defining_functions
param
The name of an argument to be passed to the function. A function can have up to 255 arguments.