JavaScript基础_day4

      ==函数==

函数的概念

  函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用

 

函数介绍

  * 函数是一种结构,使用 function 关键字声明

  * 函数不会自动运行

  * 函数定义后,需要主动调用才会触发

// 1,声明函数,将代码存入结构中
function 函数名() {
    函数体:一段代码
}

// 2,调用函数,执行函数体代码
函数名();

  * 调用的时候千万不要忘记添加小括号

  * 口诀:函数不调用,自己不执行

  注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码

 

函数的封装

* 函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口

* 简单理解:封装类似于将电脑配件整合组装到机箱中(类似快递打包)

 

例子:封装计算1-100累加和

// 计算1-100之间的函数

// 声明函数

function getSum () {
    let sumNum = 0; // 准备一个变量,保存数字和
    for (let i = 0; i<= 100; i++) {
          sumNum += i;  // 把每个数值都累加 到变量中
    }
    alert(sumNum);
}

//调用函数
getSum();

  

-函数参数

 

 * 参数的母的是让函数能够变得灵活,可以完成不同的,但是功能类似的需求

 * 函数参数分为两种:

  # 形参:定义函数时的参数,属于占座位

  # 实参:调用函数时的参数,属于实际数据

* 函数不会自动运行:所以先占位;调用时就是要实际运行,所以给数据

 

参数的作用:在函数内部某些值不能固定,我们可以通过参数在调用函数传递不同的值进去。

函数参数的运用

// 袋参数的函数声明
function 函数名 (形参1,形参2,形参3....) {
    // 可以定义任意多的参数,用逗号分隔
    
    // 函数体
}

// 带参数的函数调用
函数名(实参1,实参2,实参3....);

  1,调用的时候实参值是传递给形参的

  2,形参简单理解为:不用声明的变量

  3,实参和形参的多个参数之间用逗号 (,)分隔

 

 

函数形参和实参数量不匹配是

 

参数个数 说明
实参个等于形参个数 输出正确结果
实参个数多于形参个数 只取形参的个数
实参个数小于形参个数 多的形参定义为 undefined ,结果为 NaN


注意:在JavaScript 中,形参的默认值是undefined。

小结:

* 函数可以带参数也可以不带参数

* 声明函数的时候,函数名括号里的是形参,形参的默认值为 undefined 

* 调用函数的时候,函数名括号里面的是实参

* 多个参数中间用逗号分隔

* 形参的个数可以和实参个数不匹配,但是结果不可预计,我们尽量要匹配

 

==函数的返回值=

返回值是函数运行后的结果处理方式

* 实际开发过程中,不会再函数内部进行输出,都是把结果返回给调用者

  # 函数不对结果负责:函数只负责做,至于做出来是否合适不管

* return 关键字

  # JS函数可以没有返回值

  #可以使用return 返回任意类型数据

  # return 会终止函数的继续执行,(结束函数运行)

返回值:函数调用整体代表的数据,函数执行完成后可以通过return 语句将指定数据返回。

  

// 声明函数
function 函数名 () {
    ....
    return  需要返回的值

}
// 调用函数
函数名();  //此时调用函数就可以得到函数整体内 return 后面的值

  * 在使用  return 语句时,函数会停止执行,并返回指定的值

  * 如果函数没有 return 返回的值是 undefined 

 

break 、 continue 、 return 的区别

* break:结束当前的循环体(如 for、while)

* continue:跳出本次循环,继续执行下次循环(如for、while)

* return:不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码

 

 

-arguments关键字

 

  • 1.arguments关键字:获取函数的所有实参

  • 2.为什么要有arguemnts关键字

    • js是一门弱语言:声明函数的时候假如只有一个形参,实际上在调用的时候无论我们传入多少实参程序都不会报错

    • 为了防止这种情况:函数有一个arguments关键字来获取所有的实参

  • 3.arguments特点

    • 1.只能在函数体中使用,在函数外使用会报错

    • 2.是一个特殊的数组(伪数组)

      • 有数组的三要素,但是没有数组其他的方法

    • 3.arguemngs数组中的元素与形参一一对应

  • 4.arguements好处:可以让函数变得更加灵活

    • 可以让函数根据实参的不同而实现不同的功能

arguments 的使用

当不确定有多少个参数传递的时候,可以用arguments 来获取,JavaScript 中,arguments实际上它是当前函数的一个内置对象。所有函数都内置了一个arguments 对象,arguments 对象中存储了传递的所有参数。arguments展示形式是一个伪数组,因此可以进行遍历,伪数组具有以下特点:

1,具有length 属性

2,按索引方式存储数据

3,不具有数据的 push , pop 等方式

  注意:在函数内部使用该对象,用此对象获取函数调用时传的实参。

 

 

函数内部可以调用另一个函数,在同一作用域代码中,函数名即代表封装的操作,使用函数名加括号即可以将封装的操作执行

 

  

函数另一种声明方式

1,函数声明: function 函数名() {} ;

// 声明定义方式
function fn () {....}

// 调用
fn();

  

2,函数表达式:let 函数名 = 匿名函数

  * 匿名函数:函数的字面量又称为匿名函数,顾名思义就是没有变量名的函数

  * let 函数名 = function() {};

// 这是函数方式写法,匿名函数后面跟跟分号结束
let fn = function () {...};

//调用的方式,函数调用必须写到函数整体下面
fn();

    * 因为函数没有名字,所以也被称为匿名函数

    * 这个fn 里面存储的是一个函数

    * 函数表达方式原理跟声明变量方式是一致的

3,两者唯一的区别:函数声明可以在任何地方调用,而函数表达式方式调用必须在声明后面

 

 

-回调函数

1,什么是回调函数,如果一个函数的参数也是一个函数,那么这个参数函数就叫做回调函数

2,为什么要有回调函数?

  * 当一个函数调用执行完毕之后,我想执行另一段代码块,也就是调用另一个函数

  * 但是有时候可能本函数执行完毕后,根据不同的情况需要调用的函数也不同,那么我们可以使用形参来接收这个函数,然后再调用

  * 此时: 这个形参函数就称之为回调函数

<script>
    //回调函数:如果一个函数的参数也是一个函数,那么这个参数函数就叫做回调函数
    //回调函数在什么地方会执行呢?   函数名() 的时候执行
    //回调函数难点: 本质是一个参数
    //谁来传:调用者传参   (函数名)
    //谁来收,调用:函数调用  (函数执行完函数体之后,调用保存在这个参数中的一段代码)


    function a (  ) {
        console.log ( "哈哈" );

    }

    function b (  ) {
        console.log ( "呵呵" );
    }

    //c函数有一个功能,可以接收调用者传递过来的一段代码,并且在执行完自身函数体之后,会帮调用者执行这一段代码
    function c ( fn ) {
        console.log ( "嘿嘿" );
        //fn里面是调用者传递过来的一段代码,怎么让这段代码执行呢?
        fn();
    };

    //调用函数c,传的是变量a中存储的一段代码
    c(a);
    c(b);
    
    // 注意:回调函数是将函数的代码传递给形参,让函数内部调用
    // 注意:在传递实参给形参的时候,如果是要回调函数,那么只要传入函数名字(此时不掉用,函数内部调用):c(a),fn = a
    // 如果在传入实参的时候,给函数名增加了括号:c(a()),此时表示将a函数先执行,然后将a()函数的返回值,传递给形参fn = a()
  
</script>

  

实际应用

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /**
         * 求和,可以实现1到N次方的数组元素的求和
         * @param {array} 要求和的数组
         * @param {function} 要调用的外部方法(求N次方)
         * @return sum,数组所有元素的N次方的和
         */
        function getSum(arr, fn) {
            //定义变量保存结果
            let sum = 0;

            //遍历数组
            for (let i = 0; i < arr.length; i++) {
                //拿到的元素需要使用fn加工
                sum += fn(arr[i]);
            }

            //返回结果
            return sum;
        }

        /**
         * 求平方
         * @param {number} num,要求平方的数据
         * @return res,num的平方
         */
        function fn1(num) {
            return num * num;
        }

        /**
         * 求立方
         * @param {number} num,要求平方的数据
         * @return res,num的平方
         */
        function fn2(num) {
            return num * num * num;
        }

        //定义数组
        let arr = [1, 2, 3];

        // 求数组的所有元素的平方和
        console.log(getSum(arr, fn1));

        //求数组的所有元素的立方和
        console.log(getSum(arr, fn2));

        //匿名函数回调应用:求数组的所有元素的四次方和
        console.log(getSum(arr, function (num) { return Math.pow(num, 4) }));
        //等价于
        /*
        	function getSum(arr, fn) {
                //定义变量保存结果
                let sum = 0;
                fn = function (num) { return Math.pow(num, 4) };

                //遍历数组
                for (let i = 0; i < arr.length; i++) {
                    //拿到的元素需要使用fn加工
                    sum += fn(arr[i]);
                }

                //返回结果
                return sum;
            }
        */
        
        //匿名回调函数的优势:用后即焚,不占用内存

    </script>
</body>

</html>

  

 

-自调用函数

1,什么是自调用函数: 函数自己调用自己

  * 最常见的:匿名函数自调用

2,自调用函数作用

  * 开辟作用域,js中只有函数才可以开辟作用域:防止全局污染

3,匿名函数自调用语法:( function () {} ) ()

  * 将整个函数使用小括号包裹,然后再后面再加上小括号调用

 

 

 

<script>

    /*自调用函数:函数自己调用自己
        * 最常见的:匿名函数自调用
     */


    //作用:开辟作用域,js中只有函数才可以开辟作用域

    //匿名函数相当于字面量函数,由于没有函数名,所以只能在声明的同时调用
    //语法:  ( function(){} ) ()     将整个函数使用小括号包裹,然后在后面再加上小括号调用
    (function (  ) {
        console.log ( "我是匿名函数" );
    })();

    //补充:其实有名字的函数也可以自己调用自己,只是比较少见
    (function test(  ) {
        console.log ( "我是有名字的函数,我也可以自调用" );
    })();

	//自调用作用:暂时因为知识点不足以支撑案例使用,等后面讲到WebAPI的时候可以用到
   
</script>

 

  

 

posted @ 2020-11-15 23:53  Strive_YM  阅读(68)  评论(0)    收藏  举报