第8章:02-函数的实参和形参

函数的实参和形参

+ 实参和形参的区别
+ 可选形参
+ 可变长的实参列表:实参对象
  - 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'})

上面代码中,传入的实参是一个对象,虽然实参中 名/值对 的顺序不一样,但都能正常执行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值