一、函数
1).函数
说道函数,我想在大多数编程语言中,大家印象都很深刻。通过函数可以封装任意多语句,而且可以在任何地方任何时候去调用执行。ECMAScipt中,使用关键字function
来声明,后跟一组参数及函数体。如下:
function test(arg0,arg1,....)
{
console.log('1')
}
调用函数的时候可以使用函数名后跟一对圆括号test()
; 如果不写return
语句,即函数就没有返回值,写了的话函数变为有返回值的函数,return语句后面的代码将永远不执行。
2).参数
ECMAScipt函数与的参数与其他编程语言中的函数有所不同,因为它不介意传递来多少个参数,也不在乎传进来的参数是什么数据类型。就是说,即使你定义的函数有俩个参数,在调用的时候也不一定要传递俩个参数,可以传一个、三个甚至不传,因为在函数接受的始终是一个参数数组,而不关心数组中包含哪些参数,arguments
.这个关键字对象来访问它。但是这个实际上不是一个真正的数组,我们一般称为类数组。
function say(){
return 'hh' + arguments[0] + arguments[1] ;
}
say('hello','world');hh hello world
我们可以使用arguments.length
来访问参数的个数。这地方有一个很容易出错的点,我通过例子给大家讲解:
function add(num1,num2){
arguments[1] = 10;
console.log(arguments[0] + num2);
}
add(10);//NaN
add(10,1);// 20
function add1 (num1,num2){
num2 = 20;
arguments[1] = 10;
console.log(num2)
console.log(arguments[1])
}
add1(10);// 20 10;
add1(10,1);//10 10
当执行这个函数的时候,都会把第二个参数修改为10,因为arguments对象中的值都会反映到对应的命名参数,所以修改了arguments[1] 也就是修改了num2,但是这并不意味着访问这俩个值的空间是一样的,它们的空间是独立的,但值是同步的。不过这种影响是单向的,即arguments[1]变了 num2 变了,反之不成立;另外还要记住:如果传入了一个参数,那么arguments[1]设置的值不会反应到对应的命名参数上(即add(10) ==> NaN),因为arguments的值反应的是传入参数的个数决定的,而不是由定义函数时的命名参数的个数决定的。关于参数,还请记住最后一点,没有传递值的命名参数将自动赋值为undefined。现在回过头来,看下上面的例子,是否清楚明白了?
3).函数没有重载
ECMAScript并不能像Java语言那样为函数实现俩次定义,只要这俩个函数的签名不同即可。但是ECMAScript没有函数签名,因为其参数是包含零个或者多个值的数组来表示的
function add(num){
return num + 100;
}
function add(num){
return num + 300;
}
add(100);// 400
上面的例子中,函数被定义了俩次,只是后定义的覆盖了前面定义的。
二、总结
本篇文章只是对ECMAScript的函数简单认识,与其他编程语言函数的不同。
①:ECMAScript函数无须指定返回值,因为函数任何时候都有返回值,只是你未显示的指定返回值的时候,函数返回undefined。
②:ECMAScript函数没有函数签名的概念,因为其参数是由零个或者多个数值组成的数组形式传递的。
③:可以向ECMAScript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数。
④:由于函数没有签名,所以不能实现函数重载