函数的实参和形参
+ 实参和形参的区别
+ 可选形参
+ 可变长的实参列表:实参对象
- callee 和 caller 属性
+ 将对象属性用做实参
大多数情况下 JS 的默认行为是:省略的实参都将是 undefined,多出的实参会自动省略。
实参和形参的区别
JavaScript权威指南:
实参(parameter):是在运行时的函数调用时传入的参数
形参(argument):相当于函数中定义的变量
function test(a, b) { // 定义函数时的参数叫做形参,如 a,b
// some code ...
}
test(1, 4) // 调用时给的参数称为实参,如 1,4
可选形参
当调用函数的时候传入的实参比函数声明时指定的形参个数要少时,剩下的形参都将自动设置为 undefined
值。
// 实参和形参相等时
function fun (name, age) {
console.log(`我的名字是:${name},年龄为:${age}`);
}
fun('cez', 22);
// 实参少于形参时
function fun1 (name, age) {
console.log(`我的名字是:${name},年龄为:${age}`);
}
fun1('cez');
上面代码中,形参(
age
)没有对应的实参,所以在函数体内自动设置为undefined
值。
为了在调用函数时形参保持较好的适应性,应当给省略的参数赋一个合理的默认值,如下:
// 方式一
function fun (name, age = 201) {
console.log(`我的名字是:${name},年龄为:${age}`);
}
fun('cez');
// 方式二
function fun1 (name, age) {
age = age || 202;
console.log(`我的名字是:${name},年龄为:${age}`);
}
fun1('cez');
可变长的实参列表:实参对象
实参对象是一个类数组对象,在函数体内,标识符 arguments
是指向实参对象的引用。实参对象保存了所有的实参值,可以通过数字下标就能访问传入函数的实参值。
可以这样理解,类数组对象它是一个对象,只是碰巧具有以数字为索引的属性。
function fun(name, age) {
console.log(`参数 name:${arguments[0]}`);
console.log(`参数 age:${arguments[1]}`);
console.log(arguments);
}
fun('cez', 22);
实参对象有一个重要的用处,就是让函数可以操作任意数量的实参。如下:
function max() {
var max = null;
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] > max) max = arguments[i];
return max;
}
}
上面代码中,函数
max
可以接受任意数量的实参,并返回实参中最大值。
callee 和 caller 属性
实参对象定义了 callee 和 caller 属性。在非严格模式下, ECMAScript标准规范规定 callee 属性指定当前正在执行的函数。caller 是非标准的,但大多数浏览器都实现了这个属性。
function fun() {
console.log(arguments);
}
fun();
可以看到实参对象(
arguments
)有一个callee
属性,并且指向了当前函数。所以,在匿名函数中可以通过callee
属性访问自身,如下:
var sum = function (x) {
if (x <= 1) return 1;
return x + arguments.callee(x-1);
}
console.log(sum(10)); // 55
将对象属性用做实参
当一个函数包含多个参数时,在调用的时候需要记住实参的正确属性实在令人头疼。为了解决这个问题,可以通过 名/值对 的形式来传入参数,这样参数的顺序就无关紧要了。
function fun(obj) {
console.log(`${obj.name} --- ${obj.age}`);
}
fun({name: 'cez', age: 22})
fun({age: 21, name: 'zlz'})
上面代码中,传入的实参是一个对象,虽然实参中
名/值对
的顺序不一样,但都能正常执行。