理解参数
ECMAScript函数的参数与大多数其他语言中函数的参数有所不同。ECMAScript函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数。可以传递一个、三个甚至不传递参数,而觯析器永远不会有什么怨言。之所以会这样,原因是ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素,无所谓;如果包含多个元素,也没有问题。实际上,在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
其实,arguments对象只是与数组类似(它并不是Array的实例),因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[o],第二个元素是argumetns [1],以此类推),使用length属性来确定传递进来多少个参数。在前面的例子中,sayHi()函数的第一个参数的名字叫name,而该参数的值也可以通过访问arguments[o]来获取。因此,南昌网站建设公司工程师提示,那个函数也可以像下面这样重写,即不显式地使用命名参数:
function sayHi() {
alert( "Hello"+arguments[0]+","+arguments[1]);}
sayHi( "Nicholas”,"how are you today?");
这个重写后的函数中不包含命名的参数。虽然没有使用name和message标识符,但函数的功能依旧。这个事实说明了ECMAScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。另外,在命名参数方面,其他语言可能需要事先创建一个函数签名,而将来的调用必须与该签名一致。但在ECMAScript中,没有这些条条框框,解析器不会验证命名参数。
通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。下面这个函数会在每次被调用时,输出传入其中的参数个数:
function howManyArgs() {
alert (arguments.length);
}
howManyArgs(”string”,45); //2
howManyArgs(); //0
howManyArgs {12); //1
执行以上代码会依次出现3个警告框,分别显示2、0和l。由此可见,南昌建网站公司工程师提示,开发人员可以利用这一点让函数能够接收任意个参数并分别实现适当的功能。请看下面的例子:
function doAdd() {
if (arguments.length==1) {
alert (arguments[0]+10);
) else if(arguments.length==2) {
alert( arguments[O] +arguments [1]);
}
}
doAdd (10); //20
doAdd(30,20); //50
函数doAdd()会在只有一个参数的情况下给该参数加上10;如果是两个参数,则将那个参数简单相加并返回结果。因此,南昌网站制作公司工程师提示,doAdd(10)会返回20,而doAdd(30,20)则返回50。虽然这个特性算不上完美的重载,但也足够弥补ECMAScript的这一缺憾了。
另一个与参数相关的重要方面,就是arguments对象可以与命名参数一起使用,如下面的例子所示:
function doAdd(numl, num2){
if(arguments.length ==1){
alert(numl+10);
}else if (arguments.length == 2)
alert(arguments[o]+num2);
}}
doAdd (10); //20
doAdd(30,20); //50
在此,南昌做网站公司工程师经验总结,在重写后的这个doAdd()函数中,两个命名参数都与arguments对象一起使用。由于numl的值与arguments[o]的值相同,因此它们可以互换使用(当然,num2和arguments [1J也是如此)。 关于参数还要记住最后一点:没有传递值的命名参数将自动被赋予undefined值。这就跟定义了变量但又没有初始化一样。例如,如果只给doAdd()函数传递了一个参数,则num2中就会保存 undefined值。
ECMAScript中的所有参数传递的都是值,不可能通过引用传递参数。
希望本文对广大站长或从事企业网站建设公司的团队有所帮助,如对此不太理解的,可以与南昌网络公司百恒网络技术部联系。我们很高兴与广大站长和从事企业网站建设公司技术人员分享我们的技术和经验。
南昌网站建设--百恒网络,专业专注于南昌网站设计|南昌网站推广,为用户提供高品质的网络产品和优质的服务是我们始终追求的目标!