web前端学习628-648(JavaScript函数---函数概念,使用,函数的参数,函数的返回值,arguments的使用,函数案例,函数的两种声明方式)

函数

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

函数都有返回值

  1. 如果函数有return 返回 return 后面的值
  2. 如果函数后面没有 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的使用

  1. 当我们不确定有多少个参数传递的时候, 可以用arguments来获取。
  2. arguments是当前函数的一个内置对象
  3. 所有函数都内置了一个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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值