Existe um número máximo de argumentos que as funções JavaScript podem aceitar?

Eu sei que funções JavaScript podem aceitar “qualquer” número de argumentos.

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

Mas eu estou querendo saber se há realmente um limite para quantos “qualquer” pode ser?

Por exemplo, digamos que eu entrego um milhão de argumentos para f() . Isso funcionaria? Ou o intérprete se curvaria?

Eu estou supondo que o máximo seja (a) específico da implementação ou (b) (2^32)-1 , já que o object arguments é parecido com um array.

Eu não vejo isso mencionado na especificação da linguagem, mas talvez eu não esteja conectando alguns pontos.

Embora não haja nada específico que limite o número máximo teórico de argumentos na especificação (como a resposta de thefortheye aponta). Existem, obviamente, limites práticos . Esses limites são totalmente dependentes da implementação e, muito provavelmente, também dependerão exatamente de como você está chamando a function.


Eu criei este violino como um experimento.

 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)); } 

Aqui estão meus resultados:

  • Chrome 33.0.1750.154 m: O último teste bem-sucedido foi de 65535 argumentos. Depois disso, falhou com:

    Não Alcançado RangeError: tamanho máximo da pilha de chamadas excedido

  • Firefox 27.0.1: O último teste bem-sucedido foi de 262143 argumentos. Depois disso, falhou com:

    RangeError: array de argumentos passado para Function.prototype.apply é muito grande

  • Internet Explorer 11: O último teste bem-sucedido foi 131071 argumentos. Depois disso, falhou com:

    RangeError: SCRIPT28: Fora do espaço da pilha

  • Opera 12.17: O último teste bem-sucedido foi 1048576 argumentos. Depois disso, falhou com:

    Erro: Function.prototype.apply: argArray é muito grande

Claro, pode haver outros fatores em jogo aqui e você pode ter resultados diferentes.


E aqui está um violino alternativo criado usando eval . Mais uma vez, você pode obter resultados diferentes.

  • Chrome 33.0.1750.154 m: O último teste bem-sucedido foi de 32767 argumentos. Depois disso, falhou com:

    Untaught SyntaxError: Muitos argumentos na chamada de function (somente 32766 são permitidos)

    Este é particularmente interessante porque o próprio Chrome parece estar confuso sobre quantos argumentos são realmente permitidos.

  • Firefox 27.0.1: O último teste bem-sucedido foi 32767 argumentos. Depois disso, falhou com:

    roteiro muito grande

  • Internet Explorer 11: O último teste bem-sucedido foi 32767 argumentos. Depois disso, falhou com:

    RangeError: SCRIPT7: Memória insuficiente

  • Ópera 12.17: O último teste bem sucedido foi 4194303 argumentos. Depois disso, falhou com:

    Fora da memory; script terminado.

ECMAScript 5.1, parte 8.8

O tipo List é usado para explicar a avaliação de listas de argumentos (ver 11.2.4) em novas expressões, em chamadas de function e em outros algoritmos onde é necessária uma lista simples de valores …. Essas seqüências podem ser de qualquer tamanho.

Portanto, não há limite no padrão. É claro que, se o seu código é executado no mundo real, não em padrões-terra, obviamente há algum limite (por exemplo, número de partículas no universo).

Existem duas maneiras de passar parâmetros para uma function.

  • “Literalmente”: f(a, b, c)
  • Com apply (): f.apply(null, [a, b, c])

Este último caminho é o cenário mais realista para grandes listas de argumentos.

Vá para este JSFiddle para ver os limites de cada um deles para o seu navegador atual.

Eu tentei alguns navegadores eu mesmo:

  | apply() | literal ---------------------------- Chrome 14 | 131155 | 32767 Chrome 35 | 126213 | 65535 Firefox 30 | 500001 | 65535 IE 9 | 254335 | 65533 IE 10 | 253667 | 65533 IE 11 | 252447 | 65533 Opera 22 | 126063 | 65535 Safari 4 | 524215 | 524205 Safari 7 | 65537 | 522159 

Vi diferenças em muitos desses números em máquinas diferentes, então acredito que há outros fatores em jogo além do navegador (o SO).


Este é um problema real, não algumas trivialidades. Um exemplo do mundo real:

A Google Closure Library definiu a seguinte function.

 goog.crypt.byteArrayToString = function(array) { return String.fromCharCode.apply(null, array); }; 

Isso funcionou apenas se o comprimento da cadeia estivesse dentro do limite do navegador para o número de argumentos que podem ser passados ​​com o Function.prototype.apply .

A function foi posteriormente corrigida , tornando a function significativamente mais complicada.


Para sua informação, há um problema de Webkit aberto arquivado em março de 2012 que discute o limite de argumento.

De acordo com a especificação padrão do Script ECMA 5.1 para a List ,

O tipo List é usado para explicar a avaliação de listas de argumentos (ver 11.2.4) em novas expressões, em chamadas de function e em outros algoritmos onde é necessária uma lista simples de valores. Valores do tipo List são simplesmente sequências ordenadas de valores. Estas sequências podem ser de qualquer comprimento.

Portanto, o padrão não tem limitações quanto ao número de argumentos e é limitado apenas pela memory.

Estupidências de computador
> de estupidez de computador

Tanto quanto eu estou preocupado, o limite é “grande o suficiente”!

É puramente dependente de quão poderoso é o cliente.

Porque o navegador perderá sua memory, se você vai passar milhões de argumentos.

Cada variável contém alguma memory. Portanto, os navegadores não terão problemas para alocar cada variável em alguma memory, até que ela mesma não tenha memory para ser executada.

Aqui está como eu verifico.

 let args = []; while(true){ try{ (() => {})(...args); args.push(0); }catch(e){ console.log(e.message); console.log(`Number of arguments: ${args.length}`); break; } } 

De acordo com a seção JavaScript da MDN, a quantidade máxima de parâmetros que uma function pode aceitar é 255 .

https://developer.mozilla.org/pt-BR/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.