函数
1 函数的概念
在JS里面 , 可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。
虽然for循环语句也能实现一些简单的重复操作.但是比较具有**局限性 ** , 此时我们就可以使用JS中的函数。
函数 : 就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用(目的)。
eg
function getSum(num1,num2) {
var sum = 0;
for(var i = num1; i <= num2; i++ ) {
sum += i;
}
console.log(sum);
}
getSum(1,100);
getSum(1,1000);
2 函数的使用
step
1 声明函数 2 调用函数
2.1 声明函数
// 1 声明函数
function 函数名() {
// 函数体
}
- 声明函数 function 关键字 小写
- 函数是做某件事情 函数名是一般动词 比如sayhi
2.2 调用函数
// 2 调用函数
函数名();
- 调用函数千万不要忘记加小括号
- 函数不调用 自己不执行
注意:函数本谁并不会执行代码,只有调用函数才会执行函数体代码
eg (下面代码不规范,不能运行,只是一个样式加一个例子形式)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 函数使用分为两步 声明函数 和 调用函数
// 1 声明函数
function 函数名() {
// 函数体
}
function sayhi() {
console.log('hi');
}
// 1 声明函数 function 关键字 小写
// 2 函数是做某件事情 函数名是一般动词 比如sayhi
// 3 函数不调用 自己不执行
// 2 调用函数
函数名();
sayhi();
// 调用函数千万不要忘记加小括号
</script>
</body>
</html>
2.3 函数的封装
- 函数的封装是把一个或者多个功能通过函数的方式封装起来, 对外只提供一个简单的函数接口
- 简单理解:封装类似于将电脑配件整合组装到机箱中(类似快递打包)
案例:利用函数计算1~100之间的累加和
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getSum() {
var sum = 0;
for(var i = 1; i <= 100; i++){
sum += i;
}
console.log(sum);
}
getSum();
</script>
</body>
</html>
3 函数的参数
3.1 形参和实参
在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些称为形参
在调用函数时,同时也需要传递相同的参数,称为实参
参数 | 说明 |
---|---|
形参 | 形式上的参数函数定义的时候传递的参数当前并不知道是什么 |
实参 | 实际上的参数函数调用的时候传递的参数实参是传递给形参的 |
参数的作用:在函数内部某些值不能固定,可以通过参数在调用函数时传递不同的值进去
// 1 函数可以重复相同的代码
function cook() {
console.log('算拉提都死');
}
cook();
// 2 我们可以利用函数的参数实现函数重复不同的代码
function 函数名(形参1,形参2...) { // 在声明函数的小括号里面是 形参 (形式上
的参数)
}
函数名(实参1,实参2...); // 在函数调用的小括号里面是实参 (实际的参数)
// 3 形参和实参的执行过程
function cook(aru) { // 形参是接收实参的 aru = '酸辣土豆丝' 形参类似于一
个变量
console.log(aru);
}
cook('酸辣土豆丝');
// 4 函数的参数可以有 也可以没有个数不限
案例:求两个数之间的和
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getSum(num1,num2) {
var sum = 0;
for(var i = num1; i <= num2; i++){
sum += i;
}
console.log(sum);
}
getSum(1,100);
getSum(3,8);
</script>
</body>
</html>
注意:多个参数逗号隔开,形参可以看做是不用声明的变量
3.2 函数形参和实参个数不匹配问题
参数个数 | 说明 |
---|---|
实参个等于形参个数 | 输出正确结果 |
实参个数多于形参个数 | 只取到形参的个数 |
实参个数小于形参个数 | 多的形参定义为undefined,结果为NaN |
// 函数形参个数匹配
function getSum(num1,num2) {
console.log(num1 + num2);
}
// 1 如果实参和形参的个数一致 则正常输出结果
getSum(1,2);
// 2 如果实参的个数 > 形参个数 会取到形参的个数
getSum(1,2,3); // 3 没有取
// 3 实参个数 < 形参个数 多余的形参会定义为 undefined 最终的结果就是 NaN
// 形参可以看成不用声明的变量 num2 是一个变量但是没有接收值 结果就是 undefined
getSum(1); // NaN
// 建议 实参和形参数目相同
3.3 小结
- 函数可以带参数也可以不带参数
- 声明函数的时候,函数名括号里面的是形参, 形参的默认值为undefined
- 调用函数的时候,函数名括号里面的是实参
- 多个参数中间用逗号分隔
- 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配
4 函数的返回值
4.1 return 语句
希望函数将值返回给调用者,可以通过return语句
// 1 函数是做某件事或者某种功能
function cook(aru) {
console.log(aru);
}
cook('大肘子');
// 2 函数的返回值格式
function 函数名() {
return 需要返回的结果;
}
函数名();
// 1 我们函数只是实现某些功能 最终的结
return实现
// 2 只要函数遇到return 就把后面的结果
果
// 3 代码验证
function getReasult() {
return 666;
}
getReasult(); // getReault() = 666
console.log(getResult()); // 666
function cook(aru) {
return aru;
}
console.log(cook('大肘子'));
// 4 求两个数之和
function getSum(num1,num2) {
return num1 + num2;
}
console.log(getSum(2,3));
案例1:利用函数求两个数的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getMAx(num1,num2) {
// if(num1 > num2){
// return num1;
// }else{
// return num2;
// }
// 利用三元运算符
return num1 > num2 ? num1 : num2;
}
console.log(getMAx(2,3));
</script>
</body>
</html>
案例2:利用函数求任意一个数组中的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getMAx(arr) { // arr接收一个数组
var max = arr[0];
for(var i = 0; i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
// getMAx([5,2,99,101,67,77]); // 实参是一个数组送过去
// 在实际开发中,经常用一个变量来接收 函数的返回结果 使用更简单
var re = getMAx([5,2,99,101,67,77]);
console.log(re);
</script>
</body>
</html>
4.2 return 终止函数
return语句之后的代码不会被执行
// 1 return 终止函数
function getSum(num1,num2) {
return num1 + num2;
alert('我是不会被执行的哦!'); // return 后面的代码不会被执行
}
console.log(getSum(1,2));
4.3 return 返回值
1 return 只能返回一个值 如果用逗号隔开多个值,以最后一个为准
function fn(num1,num2) {
return num1,num2; // 返回的结果是最后一个值
}
2 如果想返回多个值,可以存在数组里面,数组可以存放多个结果
// 求任意两个数的 加减乘除结果
function getResult(num1,num2) {
return [num1+num2, num1-num2, num1*num2; num1/num2]; // 存到数组里面
}
var re = getResult(1,2); // 返回的是一个数组
console.log(re);
4.4 函数没有return 返回 undefined
函数都有返回值
- 如果函数有return 返回 return 后面的值
- 如果函数后面没有 return 则返回 undefined
function fun1() {
return 666;
}
console.log(fun1()); // 返回666
function fun2() {
}
console.log(fun2()); // 函数返回结果undefined
4.5 break ,continue ,return 的区别
- break : 结束当前的循环体(如for、while )
- continue : 跳出本次循环,继续执行下次循环(如for. while )
- return :不仅可以退出循环,还能够返回return语句中的值, 同时还可以结束当前的函数体内的代码
5 通过榨汁机看透函数
6 arguments的使用
- 当我们不确定有多少个参数传递的时候, 可以用arguments来获取。
- arguments是当前函数的一个内置对象
- 所有函数都内置了一个arguments对象, arguments对象中存储了传递的所有实参。
eg arguments的使用.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// arguments 的使用 只有函数才有 arguments 对象 而且每个函数都内置好了这个arguments
function fn() {
// console.log(arguments); // 里面存储了所有传递过来的实参
// console.log(arguments.length);
// console.log(arguments[2]);
// 可以按照数组的方式遍历arguments
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
fn(1,2,3);
fn(1,2,3,4,5);
// 伪数组 并不是真正意思上的数组
// 1 具有数组的 length 属性
// 2 按照索引的方式进行存储的
// 3 它没有真正数组的一些方法 pop() push() 等等
</script>
</body>
</html>
案例:利用函数求任意个数的最大值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getMax() {
var max = arguments[0];
for(var i = 1; i < arguments.length; i++) {
if(max < arguments[i]){
max = arguments[i];
}
}
return max;
}
console.log(getMax(1,2,3));
console.log(getMax(1,2,31,4));
console.log(getMax(1,22,7,3));
console.log(getMax(1,2,3,6,7,8));
</script>
</body>
</html>
7 函数案例
目前对直接使用数组和arguments的使用有点混淆
案例1:利用函数封装方式,翻转任意一个数组
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
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,3,4,5,6,7]);
console.log(arr1);
var arr2 = console.log(reverse(['red','pink','blue']));
</script>
</body>
</html>
案例2:利用函数封装方式,对数组排序—冒泡排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function fn(arr){
for(var i = 0; i < arr.length; i++) {
for(var j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j+1]) {
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
var arr1 = fn([1,4,3,2,8,9]);
console.log(arr1);
var arr1 = fn([1,42,33,25,81,9]);
console.log(arr1);
</script>
</body>
</html>
案例3: 判断闰年
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function isRunYear(year) {
// 如果是闰年返回 true 否则 返回false
var flag = false;
if(year % 4 == 0 && year % 100 !=0 || year % 400 == 0) {
flag = true;
}
return flag;
}
console.log(isRunYear(2000));
console.log(isRunYear(1999));
</script>
</body>
</html>
函数可以调用另外一个函数
每个函数是独立的代码块,因此,经常会用到函数互相调用的情况
eg:
程序执行思路:
先从上往下依次执行,执行fn1这个函数,但是没有调用所以不执行,之后执行fn1,调用,然后回头取执行fn1函数,打印11,调用fn2,再去执行fn2,打印22
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 函数可以互相调用的
function fn1() {
console.log(11);
fn2(); // 在 fn1 函数里面调用了 fn2 函数
}
fn1();
function fn2() {
console.log(22);
}
</script>
</body>
</html>
案例4:用户输入年份,输出当前年份2月份的天数
7 函数两种声明方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 函数中的两种声明方式
// 1 利用函数关键字自定义函数(命名函数)
function fn() {
}
fn();
// 2 函数表达式(匿名函数)
// var 变量名 = function() {};
var fun = function(aru) {
console.log('我是函数表达式');
console.log(aru);
}
fun('pink');
// 1 fun 是变量名 不是函数名
// 2 函数表达式声明方式跟声明变量差不多 只不过变量里面存放的是值 而 函数表达式里面存放的是函数
// 3 函数表达式也可以进行传递参数
</script>
</body>
</html>