JavaScript函数能接受的参数数量是否有限制?

12 浏览
0 Comments

JavaScript函数能接受的参数数量是否有限制?

我知道JavaScript函数可以接受“任意”数量的参数。

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

但我想知道是否实际上有一个限制,可以接受多少个“任意”参数?

例如,假设我给f()传递了一百万个参数。这能工作吗?还是解释器会崩溃?

我猜最大限制可能是(a)特定于实现的,或者(b)(2^32)-1,因为arguments对象类似于数组。

我没有在语言规范中看到这个问题,但我可能忽略了一些细节。

0
0 Comments

根据ECMA Script 5.1标准规范,List类型用于解释在新表达式、函数调用和其他需要简单值列表的算法中的参数列表的评估。List类型的值只是有序的值序列。因此,标准对参数数量没有任何限制,仅受内存限制。

换句话说,JavaScript函数在理论上可以接受任意数量的参数,只受内存限制。这意味着您可以根据需要在函数中定义任意数量的参数。

然而,尽管JavaScript没有明确的参数数量限制,但在实际开发中,使用过多的参数可能会导致代码难以理解和维护。另外,当函数接受大量参数时,可能会增加内存使用量,从而影响性能。

为了解决这个问题,可以考虑以下几种方法:

1. 使用对象作为参数:将函数的参数作为一个包含多个属性的对象传递。这样可以减少函数的参数数量,并且更容易理解和使用。

2. 使用数组作为参数:将函数的参数作为一个数组传递。这样可以将多个参数打包成一个数组,减少函数的参数数量。

3. 使用剩余参数语法:使用ES6中引入的剩余参数语法,可以将函数的参数作为一个数组传递。剩余参数语法使用三个点(...)来表示,可以将传入函数的参数打包成一个数组。

这些方法可以帮助您更好地管理函数的参数,并提高代码的可读性和可维护性。但是,请注意,使用太多的参数可能会导致函数变得复杂,因此请谨慎使用。

0
0 Comments

在JavaScript中,函数可以接受的参数数量没有标准限制,但在现实世界中,肯定有某种限制,例如宇宙中的粒子数量。通过两种方式可以传递参数给函数:直接传递和使用apply()方法。使用apply()方法是处理大量参数的更切实可行的方法。这个问题的出现是因为函数的参数数量在不同的浏览器和操作系统中有不同的限制。下面是一些浏览器中参数数量限制的例子:

- Chrome 14:apply()方法最多接受131155个参数,直接传递最多接受32767个参数

- Chrome 35:apply()方法最多接受126213个参数,直接传递最多接受65535个参数

- Firefox 30:apply()方法最多接受500001个参数,直接传递最多接受65535个参数

- IE 9:apply()方法最多接受254335个参数,直接传递最多接受65533个参数

- Opera 22:apply()方法最多接受126063个参数,直接传递最多接受65535个参数

- Safari 4:apply()方法最多接受524215个参数,直接传递最多接受524205个参数

- Safari 7:apply()方法最多接受65537个参数,直接传递最多接受522159个参数

这些数字在不同的机器上可能会有所不同,所以除了浏览器之外还有其他因素(如操作系统)可能会影响参数数量的限制。

这个问题是一个真实的问题,而不仅仅是一些琐事。一个真实的例子是Google Closure Library定义的函数goog.crypt.byteArrayToString。这个函数只能在字符串的长度在函数apply()方法可以传递的参数数量限制之内时才能正常工作。后来,这个函数被修复,使得函数变得更加复杂。

值得一提的是,自2012年3月以来,存在一个Webkit的问题报告,讨论参数数量的限制。

0
0 Comments

JavaScript函数能够接受的参数数量没有具体的限制,这个限制取决于具体的实现方式和调用函数的方式。在实际应用中,这个限制是由实现方式决定的。

下面的实验结果展示了不同浏览器对于函数参数数量的限制:

在Chrome 33.0.1750.154 m中,最后一个成功的测试是65535个参数。之后,出现了"Uncaught RangeError: Maximum call stack size exceeded"错误。

在Firefox 27.0.1中,最后一个成功的测试是262,143个参数。之后,出现了"RangeError: arguments array passed to Function.prototype.apply is too large"错误。

在Internet Explorer 11中,最后一个成功的测试是131,071个参数。之后,出现了"RangeError: SCRIPT28: Out of stack space"错误。

在Opera 12.17中,最后一个成功的测试是1,048,576个参数。之后,出现了"Error: Function.prototype.apply: argArray is too large"错误。

另外,通过使用eval函数进行测试,得到的结果是:

在Chrome 33.0.1750.154 m中,最后一个成功的测试是32,767个参数。之后,出现了"Uncaught SyntaxError: Too many arguments in function call (only 32766 allowed)"错误。

在Firefox 27.0.1中,最后一个成功的测试是32,767个参数。之后,出现了"script too large"错误。

在Internet Explorer 11中,最后一个成功的测试是32,767个参数。之后,出现了"RangeError: SCRIPT7: Out of memory"错误。

在Opera 12.17中,最后一个成功的测试是4,194,303个参数。之后,出现了"Out of memory; script terminated."错误。

JavaScript函数能够接受的参数数量在不同浏览器中有不同的限制。使用apply方法并将参数作为一个数组传递给函数时,根据规范,理论上的最大值是4,294,967,295个元素,不管实际限制是什么。不同的调用方式可能会得到不同的结果。另外,使用Function构造函数创建函数时,也会受到参数数量限制的影响。因此,函数能够接受的参数数量是由多个因素决定的。

0