JS中的函数(二):函数参数(你可能不知道的参数传递)
前言:
函数分为有参有返回值,有参无返回值,无参无返回值,无参有返回值;那么对于无参数的函数你想使用函数的调用怎么办呢?如果你想封装一个代码,实现多种功能,但是形参大于实参或者实参大于形参又该如何?本文就发生函数调用过程中,值传递,参数的不对等处理原则等关于参数的一些相关操作进行阐述。
1.实参数大于形参数:
function say(name,message){ console.log('Hello' + name + message); } say('World!','ByeBye!','World’);
//控制台打印出:HelloWorld!ByeBye!
2.实参数小于形参数:
function say(name,message){ console.log('Hello' + name + message); } say('World!’);
//控制台打印出:HelloWorld!undefined
在JS中变量定义的时候,如果未给一个变量赋初值那么该变量的类型为undefiend
细心的可以发现一个规律,就是在进行函数调用的时候,不管实参的数目大于形参还是小于形参被调用的函数都会执行;在JS中函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型。发生函数调用的时候可以给一个实参也可以给多个实参,之所以会这样,是因为在js中的参数在内部是用一个数组来表示。函数接收到的始终是这个数组,而不关心数组中包含哪些参数,如果这个数组不包含任何参数也无所谓,包含多个参数也没问题,在函数体内可以通过arguments(参数)对象来访问这个参数数组,从而获取传递给参数的每个参数。 arguments对象和数组对象相类似,可以通过下标来获取传入的每一个元素(第一个元素是arguments[0]);也可以使用length属性来确定传递进来多少个参数。
3.通过arguments 来实现函数参数的“调用”:
对于上面的代码可以这样写:
function say(name, message){ console.log('Hello' + arguments[0] + arguments[1]); console.log(arguments.length); }
say('World!', 'ByeBye!’);
或者
function say(){ console.log('Hello' + arguments[0] + arguments[1]); console.log(arguments.length); } say('World!', 'ByeBye!’);
控制台打印效果都是一样的;即:HelloWorld!ByeBye!
即:在这里你可以这样理解;当发生函数调用的时候,实参被保存在叫做arguments的“数组”当中;而arguments中对应下标的值在发生函数调用的时候始终与被调用函数的参数保持;
对于这个可采用如下方法验证:
function say(name, message){ console.log(arguments[1] == message); arguments[1] = 'World!'; console.log(arguments[1] == message); } say('World!', 'ByeBye!’);
//控制台打印:true;true;
不过并不是说读取这两个值会访问相同的内存空间,他们的内存空间是独立的,但他们的值会同步,这种同步是单向的,也就是参数的改变不会改变argumens中对应的值。
function say(name, message){ console.log(arguments.length); } say('World!');
//控制打印:1;
arguments对象的长度是由传入的参数个数决定,不由定义函数的参数的个数决定。