最近在阅读《JavaScript 高级程序设计(第三版)》,通过阅读它来学习 JS 知识,本文大部知识内容分来自此书,推荐阅读。
是什么
函数是封装JS语句的一段(一坨)代码,
为什么
使用函数 省的 每次解决问题 都 需要重新写代码。
怎么办
(1)如何创建函数
使用 function
关键字来声明,后跟一组参数以及函数体,示例如下:
function functionName(arg0, arg1, .... argN) {
// do something
}
(2)返回值
- JS中的函数不强求函数一定要返回值。
- 执行完
return
语句后函数立刻停止并退出。 - 也可以直接写
return
或不返回值,则该函数的返回值为undefined
。
function sum(num1, num2) {
return num1 + num2; // 返回两数之和
alert('hello'); // 这段代码永远不会执行
}
var value = sum(1,2); // value 为 3
function sayHello(name) {
alert('Hello'+name);
return; // 直接返回(return 语句可有可无)
}
var a = sayHello('World') // a 为 undefined
关于返回值,推荐的做法是:要么让函数始终都返回一个值,要么永远都不要返回值。否则,如果函数有时候返回值,有时候不返回值,会给调试代码带来不便。
(3)参数
function num(num1) {
console.log('length: '+arguments.length); // 输出函数参数的个数
var num2 = arguments[1]; // 获取第二个参数
if (num2) { //判断是否由第二个参数
console.log(num1+num2);
} else {
console.log(num1+10);
}
}
var v1 = num(100, 200);
var v2 = num(100);
结果:
length: 2
300
--------------
length: 1
110
-
JS中的函数不介意传递进来多少参数,也不在乎传递进来的参数是什么数据类型(这么叼!!!)。这也就意味着:即使你定义的函数只接收两个参数,在调用这个函数的时候也未必一定要传递两个参数,可以传递一个或者两个、三个或者不传参数!原因是JS函数中的参数是由一个数组表示的,在函数体内,可以通过
arguments
对象来访问这个数组。 -
arguments
对象不是数组对象的实例,它只是与数组对象类似。使用arguments[N]
来访问数组中指定的参数,如arguments[0]
代表的是数组的第一个元素。 - 在函数内部使用
arguments.length
获取传递进来的参数数量。 -
命名参数只提供便利,但不是必须的。函数内部有了
arguments
对象后,函数就可以不使用命名的参数(即在括号里写的参数名)就可以在函数内部使用给函数传递的参数(很方便!!!)。通过这个特性可以在函数内部通过检查传入的参数的类型和数量并作出不同的反应,来模拟函数重载(JS没有函数重载功能,仅仅是模拟)。 -
arguments
对象可以和 命名参数一起使用。arguments
对象中“元素”的值与对应命名参数的值保持同步。
function add(num1, num2) {
// 通过 arguments 对象为参数赋值。
// 这一句代码使得 参数 num2 值 永远为10。
arguments[1] = 10;
var sum = num1 + num2;
console.log(sum);
}
add(10, 20); // 结果为 20
- JS中所有参数传递都是值,不可能通过引用传递参数。
-
arguments
对象的长度是由传入参数的个数决定的,而不是由定义函数时的命名参数的个数决定的(是由实参个数决定的,不是形参个数决定的)。