1. 参数规则
1.1. JavaScript函数定义不会为参数(parameter)规定数据类型。
1.2. JavaScript函数不会对所传递的参数(argument)实行类型检查。
1.3. JavaScript函数不会检查所接收参数(argument)的数量。
2. 参数默认
2.1. 如果调用参数时省略了参数(少于被声明的数量), 则丢失的值被设置为: undefined。
2.2. 如果函数调用的参数太多(超过声明), 则可以使用arguments对象来达到这些参数。
3. 函数参数值传递
3.1. 如果函数参数非引用类型, 那么函数改变了参数的值, 它不会改变参数的原始值。
3.2. 参数的改变在函数之外是不可见的。
var a = 100;
function myFunction(a) {
a -= 99;
}
myFunction(a);
document.write('a = ' + a + '<br />'); // 输出a = 100
4. 函数参数引用传递
4.1. 如果函数参数是引用类型, 例如是对象, 如果函数改变了对象属性, 它也改变了原始值。
4.2. 对象属性的改变在函数之外是可见的。
var obj = {b: 'zhangsan'};
function myFunction(obj) {
obj.b = 'lisi';
}
myFunction(obj);
document.write('b = ' + obj.b + '<br />'); // 输出b = 'lisi'
4.3. 例子
4.3.1. 代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>函数参数值、引用传递</title>
</head>
<body>
<script type="text/javascript">
var a = 100;
var obj = {b: 'zhangsan'};
function myFunction(a, obj) {
a -= 99;
obj.b = 'lisi';
}
myFunction(a, obj);
document.write('a = ' + a + '<br />');
document.write('b = ' + obj.b + '<br />');
</script>
</body>
</html>
4.3.2. 效果图
5. arguments对象
5.1. 在函数代码中, 使用特殊对象arguments, 开发者无需明确指出参数名, 就能访问它们。
5.2. 我们可以使用arguments[0]的形式访问函数参数, 即第一个参数的值(第一个参数位于位置0, 第二个参数位于位置1, 依此类推):
// arguments[0]访问第一个参数
document.write('第一个参数: ' + arguments[0] + '<br />');
// arguments[1]访问第二个参数
document.write('第二个参数: ' + arguments[1] + '<br />');
5.3. 实例
5.3.1. 代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>arguments访问参数值</title>
</head>
<body>
<script type="text/javascript">
function myFunction(a, b) {
// arguments[0]访问第一个参数
document.write('第一个参数: ' + arguments[0] + '<br />');
// arguments[1]访问第二个参数
document.write('第二个参数: ' + arguments[1] + '<br />');
return a * b;
}
myFunction(8, 9);
</script>
</body>
</html>
5.3.2. 效果图
6. 检测参数个数
6.1. JavaScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档, 最多可接受255个), 而不会引发任何错误。任何遗漏的参数都会以 undefined传递给函数, 多余的参数将忽略。
6.2. arguments对象的length属性返回函数调用实际参数的个数。
function howManyArgs() {
// arguments.length返回函数调用实际参数的个数
document.write('该函数有' + arguments.length + '个参数<br />');
}
howManyArgs();
howManyArgs(8);
howManyArgs(8, 'abc');
6.3. 实例
6.3.1. 代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>arguments length属性</title>
</head>
<body>
<script type="text/javascript">
function howManyArgs() {
// arguments.length返回函数调用实际参数的个数
document.write('该函数有' + arguments.length + '个参数<br />');
}
howManyArgs();
howManyArgs(8);
howManyArgs(8, 'abc');
</script>
</body>
</html>
6.3.2. 效果图
7. 模拟函数重载
7.1. 可以使用arguments对象判断传递给函数的参数个数, 即可模拟函数重载:
function doAdd() {
document.write('doAdd()<br />');
var value = 0;
for(var i = 0, l = arguments.length; i < l; i++){
value += arguments[i];
}
document.write('value = ' + value + '<br />');
return value;
}
doAdd();
doAdd(8);
doAdd(8, 9);
doAdd(8, 9, 10);
7.2. 实例
7.2.1. 代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<title>arguments模拟函数重载</title>
</head>
<body>
<script type="text/javascript">
// 做加法运算的函数
function doAdd() {
document.write('doAdd()<br />');
var value = 0;
for(var i = 0, l = arguments.length; i < l; i++){
value += arguments[i];
}
document.write('value = ' + value + '<br />');
return value;
}
function doAdd(a, b) {
document.write('doAdd(a, b) a = ' + a + ', b = ' + b + '<br />');
var value = 0;
for(var i = 0, l = arguments.length; i < l; i++){
value += arguments[i];
}
document.write('value = ' + value + '<br />');
return value;
}
// 就近原则, 调用doAdd(a, b)
doAdd();
doAdd(8);
doAdd(8, 9);
doAdd(8, 9, 10);
</script>
</body>
</html>
7.2.2. 效果图