JavaScript读书笔记03

函数

ECMAScript中函数用关键词function来声明:

function functionName(arg0, arg1){
statements
}

返回值

定义函数的时候并不需要指定返回值,你只需要在需要返回的时候返回某个值或者直接返回即可:


function sum(num1, num2){
return num1 + num2;
}

alert(sum(2,2)); //4

function sayHi(name){
alert("hi " + name);
return;
alert("this alert will never be reached");
}

alert(sayHi("someOne")); //undefined

function eat(){
alert("eating...");
}

alert(eat()); //undefined

从上面的例子可以看出,函数始终会返回一个值,如果没有return语句或者return后没有接返回值,函数自动返回的undeifined

参数

ECMAScript的参数跟大多数语言是不同的,采用了一种和松散也很灵活的方式去处理参数。

  1. ECMAScript函数不介意传递进来多少个参数,完全可以跟声明的参数个数不一致;
  2. 也不介意传进来的参数是什么数据类型,这一点很明显,因为声明函数的时候压根就没指定参数类型;

对于参数个数,其实在ECMAScript内部是用一个数组来表示参数的,函数接受到的始终是这个数组,所以参数多少个都是ok的。而且在函数内部,还可以通过arguments对象来访问这个参数数组,从而获取传递进来的每一个参数。所以下面两个函数其实是等价的:

function sum1(num1, num2){
return num1 + num2;
}

function sum2(){
return arguments[0] + arguments[1];
}

sum2中都不包含命名的参数,但是函数功能依旧,依旧可以传递参数进来。所以命名参数只是为了提供便利,而不是必须的

其实arguments对象只是跟数组类似,它并不是Array的实例,尽管你可以通过下标获取参数,也可以通过length来获取参数的个数。

关于命名参数和arguments你可以完全的混用,而且arguments对象的值永远和命名参数是同步的,修改一个,对应的就会改变。


function sum(num1, num2){
arguments[1] = 10;
return num1 + num2; //num2 is equal to 10 now
}

这里需要注意的是:如果sum只传进来一个参数时,num2不会随着arguments的改变而改变,而保持undefined

最后,ECMAScript中的所有参数都是按值传递,而没有引用传递。

没有重载

如前所诉,ECMAScript不限定参数的类型和个数,所以函数也不存在签名,也没办法像其他语言一样根据参数的个数和类型不同来实现重载,在ECMAScript中,如果定义了两个相同名字的函数,则后定义的函数会直接覆盖之前的定义:


function sum(num1, num2){

return num1 + num2;
}

function sum(num1, num2, num3){

return num1 + num2 + num3;
}

alert(sum(1,100)); //NaN, cause num3 is undefined

在ECMAScript中可以直接根据参数不同来做出不同的反应,来模仿重载。