在大部分编程语言中,函数的参数都分为两种:
声明时的参数是形参(用于接收值)
调用方法的时候传递的参数是实参(用于把值传递给形参)
但是,对于JavaScript这门弱类型语言,对函数参数的处理方面与别的强类型语言有很大不同,且灵活了很多:
形参声明不需要var。( 因为所有的变量都是用var来声明,所以这个地方省略了没啥问题。添加var会出现语法错误 )
形参,在函数内部可以作为一个普通的局部变量使用。而且通常情况下,实参已经把值赋值给了形参。例如上面例子中的
num1
和num2
在方法内部就可以作为一个普通的局部变量使用。在调用函数的时候,实参的个数可以形参的个数一致,也可以不一致。实参可以比实参的个数多,也可以比实参的个数少。
形参和实参匹配的时候总是按照顺序匹配。
函数对传入的实参,既不做类型的检查,也不做个数的检查。如果需要这些检查,需要开发者自行实现代码完成
示例代码:
// 声明一个函数,形参的个数2个
function doSomething(num1, num2){
alert(num1 + ":" + num2); // num1和num2,在方法的内部可以作为普通的局部变量使用。
}
//调用函数:把 5 传递给num1, 把 "a" 传递给num2
doSomething(5, "a"); // 弹出:5:a
//调用函数:把 "a" 传递给num1, 把 “b” 传递给num2 ."c"没有形参接受。
doSomething("a", "b", "c"); //虽然比形参的个数多,但是仍然可以正常调用。
//调用函数:把 "a"传递给num1.
doSomething("a"); //虽然比形参的个数少,但是仍然可以正常调用
1、在通过实参给形参传递参数的时候,如果实参的个数比形参少,则接收不到值的形参的初始化值为 undefined 的。
2、传递的实参比形参多的时候,多余的实参没有形参接受,正常情况下无法访问到传递过来的多余的实参。
3、其实多余的实参并没有丢失,函数帮我们保存在了一个变量(对象)中。这个变量的名字就是 arguments。
4、arguments不需要开发者手动创建,在调用函数的时候,会自动创建,并把传递过来的所有实参的值都保存在这个变量中。
5、可以暂时把arguments当成一个数组来理解,虽然他实际并不是一个数组。(其实是个对象,每个参数都是他的一个属性值)。
arguments使用代码简单实例:
关于数组的详细使用,明天再讲。
function doSomething (num1, num2) {
alert(num1 === arguments[0]); //true
alert(num2 === arguments[1]); // true
/*
只要方法被调用,则一定会自动创建一个arguments对象,这个对象会存储传过来的所有的实参。
*/
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
}
}
doSomething("a", "b", "c", "d");