(读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

时间:2023-03-08 23:00:35
(读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的。在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理。

arguments对象只是与数组类似,并不是array的实例。我们可以通过方括号语法访问arguments的每一个元素(arguments[0],arguments[1]。。。。),可以用length属性确定传递进来的参数个数。

function sayHi() {
alert("Hello " + arguments[0] + "," + arguments[1]);
}

function sayHi(name, message) {
alert("Hello " + name + "," + message);
}

第一种写法是重写第二种表达方式的,为了突出ECMAScript的一个重要特点:命名的参数只提供便利,但不是必需的

可以通过访问arguments对象的length属性获取有多少个参数传递给了函数。

function howManyArgs() {
alert(arguments.length);
}
howManyArgs("string", 45); //2
howManyArgs(); //0
howManyArgs(12); //1

我们也可以让函数能够接收任意个参数实现适当的功能,例如:

function doAdd() {
if(arguments.length == 1) {
alert(arguments[0] + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + arguments[1]);
}
}
doAdd(10); //20
doAdd(30, 20); //50

另外一个重点是:arguments对象可以与命名参数一起使用,例如:

function doAdd(num1, num2) {
if(arguments.length == 1) {
alert(num1 + 10);
} else if (arguments.length == 2) {
alert(arguments[0] + num2);
}
}

在上面这个重写的函数中,num1与arguments[0]相同,num2与arguments[1]相同,因此他们可以互换。

还有一个有趣的点,arguments对象的值永远与对应命名参数的值保持同步。

function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}

doAdd(10, 20);//20

加了'use strict'

function doAdd(num1, num2) {

'use strict'
arguments[1] = 10;
alert(arguments[0] + num2);
}

doAdd(10, 20);//30

严格模式对如何使用arguments 对象做出了一些限制。首先,像前面例子中那样的赋值会变得无效。

参考资料

《javascript高级程序设计(第3版)》第3章 基本概念