一、概念
1. 定义
- 函数是具有特定功能的代码块
- 函数是 JavaScript 中的一种数据类型,属于对象类型,使用 typeof 判断可以得到 function
// isFinite() 判断参数是否是有效数字
console.log(isFinite()); //false
// 检测的是 isFinite() 的返回(调用结果)
console.log(typeof isFinite()); // boolean
// isFinite 是函数名,本质上是变量名,该变量的值是一个function类型的数据
console.log(isFinite); // [Function: isFinite]
// 检测的是 isFinite 变量的值
console.log(typeof isFinite); // function
2. 函数的作用
- 提高代码的重用性
- 利用函数实现编程的模块化
- 封装代码,让函数内部的代码对外部不可见
3. 函数的组成
函数名: 如果一个变量的值是函数类型的数据,该变量就被称为函数,变量名就是函数名。
函数体: 函数内部的代码块。
参数: 调用函数的时候,可以通过参数向内部传递数据。
返回值: 函数调用得到的结果。
二、函数的声明
1. function 关键字方式
function 函数名(参数) {
函数体语句;
}
2. 表达式方式
使用函数直接量创建函数并赋值给变量
var 函数名 = function(参数) {
函数体语句
}
3. Function函数方式
var 函数名 = Function('');//代码写在字符串里
4. Function构造函数方式
var 函数名 = new Function();
三、函数的调用
- 在函数后面加 () 可以调用函数
- 函数只有被调用了,函数体语句才能执行;函数可以被多次调用,每调用一次,函数体语句执行一次。
- 函数只有被调用才能获取到函数的返回值
四、函数的返回值
- 函数调用的结果就是函数的返回值, 函数调用表达式(
函数名()
)的值就是函数返回值,没有返回值的函数的调用结果是undefined - 在函数体内,使用
return
关键字可以设置函数的返回值- return 的右边需要写表达式,表达式的值就是函数的返回值
- return 的右边如果是空的,该函数没有返回值
- 函数中一旦执行到了 return,函数调用结束,return 之后的代码不会执行。可以结合if语句,就不需要写else分支
function sum(a,b) {
return a + b;
}
var result = sum(4, 1)
console.log(result);
function fun(n) {
if (n % 2 == 0) return true;
return false
}
let num1 = fun(2);
let num2 = fun(5);
console.log(num1); //true
console.log(num2); //false
五、函数的参数
1. 形参和实参
形参: 在声明函数的时候设置的参数就是形参,此时的形参是一个没有赋值的变量,只可以在函数内使用
实参: 在调用函数是使用的参数就是实参,实参用于给形参赋值,实参的形式可以是直接量、变量、表达式。
2. 形参和实参数量问题
- 实参的个数应该与形参一致
- 如果实参个数>形参个数,实参按照顺序给形参赋值,多余实参没有用
- 如果实参个数<形参个数,实参按照顺序给形参赋值,没有被赋值到的形参,自动得到undefined
function add(a, b, c) {
var sum = a + b
console.log(sum);
console.log(a, b, c); //1 2 undefined
}
add(1, 2)
3. 形参的默认值(可选参数)
注意:有默认值的形参需要写在参数列表的后面!
JS函数允许形参有默认值,有默认值的形参,在调用函数的时候,可以没有与之对应的实参!
ES5设置形参默认值的方式:
function 函数名(形参1,形参2) {
if (形参2 === undefined) {
参数2 = 默认值;
}
}
ES6设置形参默认值的方式:
function 函数名(形参1,形参2=默认值) {}
4. arguments
- arguments 是系统创建的变量,在调用函数时创建,只能在函数中使用
- arguments 是类数组,成员是调用函数时传的所有的实参,具有 length 属性,可以通过索引获取其中的成员
- arguments 是除了形参之外,另一种获取实参的方式,不受到数量的限制,用于定义可变参数数量的函数
// 定义函数,计算所有参数的和
function sum() {
// 定义变量记录和
var res = 0;
// 遍历所有参数
for (var i = 0; i < arguments.length; i++) {
res += arguments[i];
}
// 返回结果
return res;
}
var result = sum(4, 1, 2)
console.log(result);
六、练习
// 定义函数 max,实现返回参数中值最大的,参数都是数字
function max() {
var res = arguments[0]
for (var i = 1; i < arguments.length; i++) {
if (arguments[i] > res) {
res = arguments[i]
}
}
return res
}
var result = max(2, 33, 5, 7, 10)
console.log(result);
// 封装数组排序的函数,参数是数组,返回值是排好序的数组,
// 参数1是数组,参数2是布尔值,fasle表示降序,true表示升序,默认值false
function sort(arr, bol = false) {
for (var i = 1; i < arr.length; i++) {
for (var j = 0; j < arr.length - i; j++) {
if (bol) { // 升序
if (arr[j] > arr[j + 1]) {
var temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
} else { // 降序
if (arr[j] < arr[j + 1]) {
var temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
}
return arr
}
console.log(sort([2, 23, 4, 65, 1], true));
console.log(sort([2, 23, 4, 65, 1]));