第四章 函数

一.函数的定义和调用

1.定义
   数的定义由以下4部分组成:关键字function、函数名、参数和函数体。

   定义命名函数:

   function funcName(参数列表){

                  statements

                  [return [expr]];

    }

    function sayHi(name, message){

                 alert("hello" + name + ", " + message);

     }

2.参数设置

  1.无参函数:适用于不需要提供任何数据,即可完成指定功能的情况。

  2. 有参函数:适用于开发时函数体内的操作需要用户传递数据的情况。

                    形参:形式参数,具有特定的含义,在定义有参函数时设置的参数。

                    实参:实际参数,也就是具体的值,在函数调用时传递的参数。

            function maxNum(a, b) {

                       a = parseInt(a);

                       b = parseInt(b);

                       return a >= b ? a : b;

             }

    3.获取函数调用时传递的所有实参:适用于开发时函数体形参不确定的情况。

       实现方式:利用arguments对象,在函数体内可获取函数调用时传递的实参。

       其他操作:length属性可获取实参的总数,具体实参值可利用数组遍历方式。

        function transferParam() {

                     console.log(arguments.length);

                      console.log(arguments);

         }

3.函数的调用

   1.直接调用:函数名(实参值)

      eg.     sayHi("南工院", "新学期开学了");

   2.在表达式中调用

       这种方式适合有返回值的函数,返回值作为表达式的一部分参与运算,有时还会和(alert、document)等语句配合输出。

       eg.

第四章 函数_第1张图片

  3.在事件中调用

     eg,

注意:return 语句不是函数必须的,但任何函数在任何时候都可以通过return语句+ 返回的值,实现返回。

           若在一个文件中,定义函数名字相同,会使用最后定义的函数。


二.函数作用域

    作用域划分:全局作用域、函数作用域和块级作用域。

    不同作用域对应的变量:全局变量、局部变量、块级变量。


三.匿名函数

    概念:匿名函数指的是没有函数名称的函数。

    作用:可以有效的避免全局变量的污染以及函数名的冲突问题。

    说明:既是函数表达式的另一种表示形式,又可通过函数声明的方式实现调用。

    表达式eg.  ① 函数表达式中省略函数名

                           var fn = function (num1, num2) {

                                          return num1 + num2;  

                           }; fn(1, 2);

                        ② 自调用方式

                            (function (num1, num2) {

                                               return num1 + num2;

                             })( 1, 2);

                          ③ 处理事件 

                              document.body.onclick = function () {

                                                 alert('Hi, everybody!');

                              };


第四章 函数_第2张图片

   回调函数

            概念:回调函数指的是一个函数A作为参数传递给一个函数B,然后在B的函数体内调用函数A。函数A称为回调函数。

            提示:匿名函数常用作函数的参数传递,实现回调函数。

            应用:函数体中某部分功能由调用者决定,此时可以使用回调函数。

            在JavaScript中还为数组提供了很多利用回调函数实现具体功能的方法。

第四章 函数_第3张图片

四.嵌套与递归

1.嵌套函数

    概念:在一个函数内部存在另一个函数的声明

    特点:内层函数只能在外层函数作用域内执行,在内层函数执行的过程中,若需要引入某个变量,首先会在当前作用域中寻找,若未找到,则                 继续向上一层级的作用域中寻找,直到全局作用域,我们称这种链式的查询关系为作用域链。

    eg.      var iBaseNum= 10; 

               function addNum(iNum1, iNum2) { 

                             function doAdd() { 

                                          return iNum1 + iNum2 + iBaseNum;

                             }

                             return doAdd(); 

                }

    2.递归的调用

       概念:递归调用是函数嵌套调用中一种特殊的调用。它指的是一个函数在其函数体内调用自身的过程,这种函数称为递归函数

       eg.    

                       function factorial(n){           //定义递归函数

                                      if(n==1){

                                               return 1;        //递归出口

                                       }

                                       return n * factorial(n=1)

                         }


五.闭包函数

   1.介绍

       在JavaScript中,内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数。但是在函数外部则         不能访问函数的内部变量和嵌套函数。此时就可以使用"闭包"来实现。

       所谓"闭包"指的是有权访问另一函数作用域内变量(局部变量)的函数,也就是闭包由函数以及创建该函数的词法环境组合而成。

       它最主要的用途是以下两点:  可以在函数外部读取函数内部的变量。

                                                        可以让变量的值始终保持在内存中

    2.闭包函数的实现

       常见创建方式:就是在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量

      eg.    function fn() {

                             var times = 0;

                             var c = function () {

                                           return ++times;

                             };

                              return c;

                }

                var count = fn(); // count是一个闭包

                // 访问测试

                console.log(count());

                console.log(count());

               console.log(count());

               console.log(count());

               console.log(count())

   3.闭包的作用

      用闭包模拟私有方法,提供类似面向对象的数据隐藏和封装。

你可能感兴趣的:(第四章 函数)