函数概念
(1) 函数(function),也叫作功能、方法,函数可以将一段代码一起封装起来,被封装起来的函数具备某一项特殊的功能,内部封装的一段代码作为一个完整的结构体,要执行就都执行,要不执行就都不执行。
(2)函数的作用就是封装一段代码,将来可以重复使用。
函数声明
(1)函数声明又叫函数定义,函数必须先定义然后才能使用。
(2)如果没有定义函数直接使用,会出现一个引用错误。
(3)函数声明语法:
function 函数名(参数){
// 封装的结构体;
}
特点:函数声明的时候,函数体并不会执行,只有当函数被调用的时候才会执行。
函数调用
(1)调用方法:函数名();
(2)函数调用也叫作函数执行,调用时会将函数内部封装的所有的结构体的代码立即执行。
(3)函数内部语句执行的位置,与函数定义的位置无关,与函数调用位置有关。
(4)函数可以一次定义,多次执行。
函数的参数
(1)函数预留了一个接口,专门用于让用户自定义内容,使函数发生一些执行效果变化。
(2)接口:就是函数的参数,函数参数的本质就是变量,可以接收任意类型的数据,导致函数执行结果根据参数不同,结果也不同。
(3)一个函数可以设置 0 个或者多个参数,参数之间用逗号分隔。
(4)函数的参数根据书写位置不同,名称也不同:
- 形式参数:定义的 () 内部的参数,叫做形式参数,本质是变量,可以接收实际参数传递过来的数据。简称形参。
- 实际参数:调用的 () 内部的参数,叫做实际参数,本质就是传递的各种类型的数据,传递给每个形参,简称实参。
(5)函数执行过程,伴随着传参的过程:
function getSum(num1,num2){
console.log(num1 + num2);
}
getSum(1,2);
// 执行过程:因为前面只声明了函数,没调用,所以先略过,先执行函数调用,调用后返上去找函数声明,把实参传递给形参,然后输出
(6)函数参数的优点:
- 不论使用自己封装的函数,还是其他人封装的函数,只需要知道传递什么参数,执行什么功能,没必要知道内部的结构什么。
- 一般自己封装的函数或者其他人封装的函数需要有一个 API 接口说明,告诉用户参数需要传递什么类型的数据,实现什么功能。
(7)形参和实参个数不匹配的问题:
- 若实参个数 = 形参个数,则正常输出结果
- 若实参个数 > 形参个数时,会取到形参的个数(有几个形参就取几个实参的值)
- 若实参格式 < 形参个数时,结果是NaN(多余的形参定义为undefined)
- 尽量让个数相匹配,形参的默认值是undefined
函数的返回值
(1)函数能够通过参数接收数据,也能够将函数执行结果返回一个值。(函数将值返回给调用者)
(2)利用函数内部的一个 return 的关键字设置函数的返回值。
(3)返回值的作用:
-
函数内部如果结构体执行到一个 return 的关键字,会立即停止后面代码的执行。
-
可以在 return 关键字后面添加空格,空格后面任意定义一个数据字面量或者表达式,函数在执行完自身功能之后,整体会被 return 矮化成一个表达式,表达式必须求出一个值继续可以参与程序,表达式的值就是 return 后面的数据。
-
return 只能返回一个值,如果用逗号隔开多个值,以最后一个为准,若想输出多个值,用数组、对象等可变相输出
// 求任意两数的加减乘除结果 function getResult(a, b) { return [a + b, a - b, a * b, a / b]; } var re = getResult(1, 2); console.log(re);
(4)应用:
- 函数如果有返回值,执行结果可以当成普通数据参与程序。
- 函数如果有返回值,可以作为一个普通数据赋值给一个变量,甚至赋值给其他函数的实际参数。
(5)注意:如果函数没有设置 return 语句 ,那么函数有默认的返回值 undefined;如果函数使用 return 语句,但是 return 后面没有任何值,那么函数的返回值也是 undefined。
(6)函数只是实现某种功能,最终结果需要返回给函数的调用者“函数名()”,通过return实现
// 定义一个求和函数 传入两个数据
// 参数:传两个参数 数据类型为数字
// 功能:得到两个数字之和
function sum(a, b) {
// console.log(a + b);
return a + b;
}
// 调用函数中 给小括号内部添加数据
sum(3, 4);
sum("3", 4);
// console.log(sum(3, 4));
// 将返回值赋值给变量
var num = sum(3, 4);
console.log(num);
// 将返回值赋值给函数的实参
console.log(sum(2, sum(3, 4)));
(7)break、continue、return的区别
- break:结束当前的循环体
- continue:跳出本次循环,继续执行下次的循环
- return:不仅可以退出循环,还能返回return语句中的值,同时还可以结束当前的函数体内的代码
函数的表达式
(1)函数表达式是函数定义的另外一种方式。
(2)定义方法:就是将函数的定义、匿名函数赋值给一个变量。
(3)函数定义赋值给一个变量,相当于将函数整体矮化成了一个表达式。
(4 )调用函数表达式,方法是给变量名加()执行,不能使用函数名加()执行。
(5)函数表达式声明方式跟声明变量差不多,只不过变量里存值,而函数表达式存函数;函数表达式也可以进行传递参数
// 定义一个函数表达式
var foo = function () {
console.log(2);
};
// 调用函数式 只能用变量名调用 函数名调用不成功
foo();
函数的数据类型
(1)函数是一种单独的数据类型 Function。
(2)由于函数是一种数据类型,可以参与其他程序。
(3)可以把函数作为另一个函数的参数,在另一个函数中调用。
setInterval(function () {
console.log(1);
}, 1000);
(4)可以把函数可以作为返回值从函数内部返回。
function fn(b) {
var a = 10;
return function () {
alert(a + b);
};
}
arguments 对象
(1)JavaScript 中,arguments 对象是比较特别的一个对象,实际上是当前函数的一个内置属性。也就是说所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有的实参。
(2)arguments 是一个伪数组,因此及可以进行遍历。伪数组的特点:具有length属性,按索引方式储存数据,不具有数组的push、pop等方法
案例:定义一个求和函数 如果传入 1 个参数 返回它自己 如果传入2个参数 返回他们的和 如果传入3个 先比较前两个的大小 大的与第三个参数求和返回 如果传入4个及以上 输出错误提示
function sum(a, b, c) {
switch (arguments.length) {
case 1:
return a;
break;
case 2:
return a + b;
break;
case 3:
return a > b ? a + c : b + c;
break;
default:
// 提示用户 实参个数传递错误
// 模拟控制台报错
throw new Error("参数个数不能超过 3 个");
}
}
// 调用函数
console.log(sum(1));
console.log(sum(1, 2));
console.log(sum(1, 2, 3));
console.log(sum(1, 2, 3, 4, 5));
函数递归
(1)函数内部可以通过函数名调用函数自身的方式,就是函数递归现象。
(2)递归的次数太多容易出现错误:超出计算机的计算最大能力。
(3)更多时候,使用递归去解决一些数学中的现象。例如:输出斐波那契数列的某一项的值。
案例:斐波那契数列:后面的一项数据是前两项数据之和。1,1,2,3,5,8,13,21,34,55……
function fibo(a) {
if (a === 1 || a === 2) {
return 1;
} else {
return fibo(a - 1) + fibo(a - 2);
}
}
console.log(fibo(2));
console.log(fibo(10));
案例:利用函数求两个数的最大值
function getMax(a, b) {
return a > b ? a : b;
}
console.log(getMax(1, 3));
案例:利用函数求数组中的最大数值
function getArrMax(arr) {
var max = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
// 用一个变量来接收函数的返回结果 使用更简单
var re = getArrMax([3, 8, 66, 55, 99, 2, 0]);
console.log(re);
案例:利用函数求任意个数的最大值
function getMax() {
var max = arguments[0];
for (var i = 1; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
console.log(getMax(1, 3, 4));
案例:利用函数翻转任意数组
function reverse(arr) {
var newArr = [];
for (var i = arr.length - 1; i >= 0; i--) {
newArr[newArr.length] = arr[i];
}
return newArr;
}
var arr1 = reverse([1, 4, 9, 5]);
console.log(arr1);
案例:利用函数判断闰年
function isRunYear(year) {
// 是闰年就返回true 否则返回false(必须是true和false,给之后操作提供方便)
var flag = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = true;
}
return flag;
}
console.log(isRunYear(1999));
案例:用户输入年份,输出当前年份2月份的天数
function backDay() {
var year = prompt("请输入年份:");
if (isRunYear(year)) {
alert("当前年份是闰年,2月份有29天");
} else {
alert("当前年份是平年,2月份有28天");
}
}
backDay();
function isRunYear(year) {
var flag = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = true;
}
return flag;
}