函数
目标
- 为什么需要函数
- 根据语法书写出函数
- 根据需求封装函数
- 说出形参和实参的传递过程
- 能够使用函数的返回值
- 能够使用arguments获取函数的参数
为什么要有函数
- 为了让大量代码重复使用
函数function 概念
- 函数(function),也叫作功能、方法,函数可以将一段代码一起封装起来,被封装起来的函数具备某一项特殊的功能,内部封装的一段代码作为一个完整的结构体,要执行就都执行,要不执行就都不执行。
- 函数就是封装了一段可以被重复执行调用的代码块。
- 函数的作用就是封装一段代码,将来可以重复使用。
// 计算1~100的和
// 声明函数
function getSum() {
var sum = 0;
for (var i = 1;i<=100;i++){
sum += i;
}
console.log(sum);
}
// 调用函数
getSum();
函数声明
- 函数声明又叫函数定义,函数必须先定义然后才能使用。
- 如果没有定义函数直接使用,会出现一个引用错误。
- 函数名命名规则:可以使用字母、数字、下划线、$,但是数字不能用来开头。不能使用关键字和保留字。
- 特点:函数声明的时候,函数体并不会执行,只有当函数被调用的时候才会执行。
- 函数声明语法:
function/* 函数声明的关键字 */ 函数名(){
封装的结构体;//函数体
}//这种声明方式的函数叫命名函数
function fun() {
console.log(1);
console.log(2);
console.log(3);
console.log(4);
}
函数调用
- 调用方法:函数名();
fun();
- 函数调用也叫作函数执行,调用时会将函数内部封装的所有的结构体的代码立即执行。
- 函数内部语句执行的位置,与函数定义的位置无关,与函数调用位置有关。
- 函数可以一次定义,多次执行。
函数的参数
- 我们希望函数执行结果不是一成不变的,可以根据自定义的内容发生一些变化。
- 函数预留了一个接口,专门用于让用户自定义内容,使函数发生一些执行效果变化。
- 接口:就是函数的参数,函数参数的本质就是变量,可以接收任意类型的数据,函数执行结果根据参数不同,结果也不同。
- 一个函数可以不设置参数或者设置多个参数,参数之间用逗号分隔。
案例一 求两个数的和
function getSum(num1,num2){
console.log(num1+num2);
}
// 调用函数时,给小括号内部添加数据
getSum(1,2);
案例二 求两个数之间的和
function getSum(num1,num2) {
var sum = 0;
for (var i = num1; i <= num2; i++) {
sum += i;
}
console.log(sum);
}
getSum(1,3);
形参和实参
- 函数的参数根据书写位置不同,名称也不同:
- 形式参数:定义函数的 () 内部的参数,叫做形式参数,本质是变量,可以接收实际参数传递过来的数据。简称形参。
- 实际参数:调用函数的 () 内部的参数,叫做实际参数,本质就是传递的各种类型的数据,传递给每个形参,简称实参。
- 函数执行过程,伴随着传参的过程:
// 2.形参接收到实参传来的数据,相当于给形参变量隐形的赋值。
function sum(形参1, 形参2) {
// 3.在参与程序时,结构体中用的就是形参接收到的实参数据,整个过程就是传参过程。
console.log(形参1 + 形参2);
}
// 1.函数调用时,会将实参传递到形参的位置
sum(实参1,实参2);
- 如果实参个数多于形参个数,则会从前往后取形参个数的实参。
- 如果实参少于形参,那么对应不上的形参,结果就是undefined(因为形参可以看成是不用声明的变量,变量没有接收值就是undefined)。此时
getSum(1);
的结果是NaN(因为任何一个数字型的加上undefined结果都是NaN)
函数的参数优点
- 不论使用自己封装的函数,还是其他人封装的函数,只需要知道传递什么参数,执行什么功能,没必要知道内部的结构什么。
- 一般自己封装的函数或者其他人封装的函数需要有一个 API 接口说明,告诉用户参数需要传递什么类型的数据,实现什么功能。
// 参数:传两个参数,数据类型为数字
// 功能:得到两个数字之和
function sum(a, b) {
console.log(a + b);
}
sum(3,4);
函数的返回值
- 函数能够通过参数接收数据,也能够将函数执行结果返回一个值。
- 利用函数内部的一个 return 的关键字设置函数的返回值。
- 作用 ①:函数内部如果结构体执行到一个 return 的关键字,会立即停止后面代码的执行。
- 作用 ②:可以在 return 关键字后面添加空格,空格后面任意定义一个数据字面量或者表达式,函数在执行完自身功能之后,整体会被 return 矮化成一个表达式,表达式必须求出一个值继续可以参与程序,表达式的值就是 return 后面的数据。
function sum(a, b) {
return a + b;//函数遇到return,把a+b的值返回给函数调用者
}
sum(a+b);//相当于sum(a+b)=a+b
函数的返回值应用
- 函数如果有返回值,执行结果可以当成普通数据参与程序。
var num = sum(3, 4);
- 函数如果有返回值,可以作为一个普通数据赋值给一个变量,甚至赋值给其他函数的实际参数。
var num = sum(3, sum(3, 4));
- 注意:如果函数没有设置 return 语句 ,那么函数也有默认的返回值 undefined;如果函数使用了return 语句,但是 return 后面没有任何值,那么函数的返回值也是 undefined。
- 注意:return 只能够返回一个值。如果后面有两个值(两个值之间用逗号隔开),返回的结果是最后一个值。如果想返回多个值,可以将多个数值放在一个数组中。如果后面需要单个数据,可以将数组用遍历将每个数据拿出来。
案例
- 输出两个数中的大数
function getMax(num1, num2) {
if (num1 > num2) {
return num1;
} else {
return num2;
}
//return num1 > num2 ? num1 : num2; 也可以用三元表达式
}
getMax(5, 8);
- 求数组[5, 2, 99, 101, 67, 77]中的最大值
function getMax(arr) {
var max = 0;
for (var i = 0; i < arr.length;i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
var re = getMax([5, 2, 99, 101, 67, 77,220]);
console.log(re);//re是result 结果的缩写
函数表达式
- 函数表达式是函数定义的另外一种方式。
- 定义方法:就是将函数的定义、匿名函数赋值给一个变量。
- 函数定义赋值给一个变量,相当于将函数整体矮化成了一个表达式。
- 这种方式声明的函数叫匿名函数(函数没有函数名)。
- 调用函数表达式,方法是给变量名加()执行,不能使用函数名加()执行
var foo2 = function (eat) {
console.log(eat);
};
// 调用函数
foo2("吃鸡腿");
函数的数据类型
- 函数是一种单独的数据类型 Function类型。
- 由于函数是一种数据类型,可以参与其他程序。
- 例如,可以把函数作为另一个函数的参数,在另一个函数中调用。
- 或者,可以把函数作为另一个函数的返回值,从函数内部返回。
arguments 对象
- JavaScript 中,arguments 对象是比较特别的一个对象,实际上是函数的一个内置对象。也就是说所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有的实参。
- arguments 是一个伪数组,可以按照数组方式进行遍历。
- 伪数组 并不是真正意义上的数组
- 具有数组的length属性
- 按照索引的方式来储存
- 没有真正数组的一些方法,pop(),push()等
- 伪数组 并不是真正意义上的数组
- 函数的实参个数和形参个数可以不一致,所有的实参都会存储在函数内部的 arguments 类数组对象中。
- 如果实参个数多于形参个数,则会从前往后取形参个数的实参。
- 如果实参少于形参,那么对应不上的形参,结果就是undefined。(因为形参可以看成是不用声明的变量,变量没有接收值就是undefined)
arguments 案例
定义一个求和函数,如果传入 1 个参数,返回它自己,如果传入两个参数,返回他们的和,如果传入三个参数,先比较前两个的大小,大的与第三个参数求和返回,如果传入 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("参数不能超过三个")
}
}
console.log(sum(1));
console.log(sum(1, 2));
console.log(sum(1, 2, 3));
console.log(sum(1, 2, 3,4));
- 利用函数求任意个数中的最大值
function getMax() {
var max = arguments[0];
for (var i = 0; i < arguments.
length; i++) {
if (arguments[i] > max) {
max = arguments[i]
}
}
return max;
}
var re = getMax(2, 8, 5, 999, 555,
5);
console.log(re);