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. 效果图