函数&作用域

141 阅读5分钟

函数

说明&作用:

函数function,是被设计为执行特定任务的代码块。

作用:简化代码,方便复用,封装程序功能。

原理:

其实就是把具有相同或相似逻辑的代码“包裹”起来,之后哪个位置需要这个功能,直接调用函数即可。例如:

需求:我有三个数组,需要分别求出他们各自的元素和。

<script>

        //声明三个不同数组
        let arr1 = [20, 40, 20, 50]
        let arr2 = [60, 40, 30, 40]
        let arr3 = [10, 50, 20, 60]


        // 封装函数
        function sum1(arr) {

            /* 不难看出,下面这段代码其实是单个数组求和的方式,我
            们可以把它封装起来,等哪个数组有求和需要,我们就直接调
            用这套代码,不就能达到求和的需要吗!也就是说,我们封装
            一个数组求和函数,可以做到多次复用的效果。 */
            let sum = 0;
            for (let u = 0; u < arr.length; u++) {
                sum += arr[u];
            }
            console.log(sum);

        }


        // 调用函数
        sum1(arr1)//130
        sum1(arr2)//170
        sum1(arr3)//140
    </script>

使用方法:

1、声明函数

 // 函数声明
        function 函数名(){ 函数体  }
        function arr() {
            alert('hai~~')
        }

2、函数调用

 // 函数调用
        函数名()
// 函数声明
        function arr() {
            alert('hai~~')
        }
 // 函数调用
        arr()

-----声明的函数必须被调用了才会真正的执行。

拓展

函数体

函数体是函数的构成部分,它负责将相同或相似代码“包裹”起来,直到函数调用时函数体内的代码才会被执行。函数的功能代码都要写在函数体当中。

函数名命名规范:

  1. 和变量命名基本一致;
  2. 尽量小驼峰式命名法;
  3. 前缀应该为动词;
  4. 命名建议:常用动词约定。

例如:image-20220401145557390

image-20220401145616207

函数传参:

介绍&作用:

是函数用来接受不同数据进行计算的,多个参数之间用逗号隔开,参数可以是一个也可以是多个。

作用:提高函数的灵活性。

语法:

image-20220401151511352

示例: image-20220401152657671

形参:

声明函数时写在函数名右边小括号里的叫形参(形式上的参数);

作用: 用来接收实参的数据,再把数据传给函数体进行计算。

实参:

调用函数时写在函数名右边小括号里的叫实参(实际上的参数);

作用:好比如计算多个数组和,那么实参就代表不同的数组。

// 调用函数
        sum1(arr1)//实参为arr1
        sum1(arr2)//实参为arr2
        sum1(arr3)//实参为arr3

拓展:

  1. 形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值;
  2. 开发中尽量保持形参和实参个数一致。

返回值(return)

说明:

返回值就是函数执行过后,给调用者的一个回馈值;

函数默认的返回值为undefined。

作用:

对执行结果的扩展性更高,可以让其他的程序使用这个结果。

语法:

 // 函数声明
        function 函数名(){ 
            ......
            return 值;
        }

例如:

//没有返回值
function getName() {
            let a = 2;
            a++;
            //return a
        }
        alert(getName())//undefined
//设置了返回值
function getName() {
            let a = 2;
            a++;
            return a//函数返回值为a
        }
        alert(getName())//3

注意:

函数里面只能执行一个return,而且执行完return后,return后面的代码将不执行,直接跳出当前函数。

 let a = 2;
        function getName() {
            return a//函数返回值为a
            a++;
        }
        alert(getName())//2
        alert(a)//设想值为3,实际为2,因为后面那句a++没有被执行。

匿名函数(了解)

含义:

没有名称的函数(如:function () { 函数体 })

使用方法:

  1. 将匿名函数赋值给一个变量,并且通过变量名称进行调用 我们将这个称为函数表达式;

    image-20220401170212028

  2. function ( ) { 函数体 }

自执行函数(了解)

介绍:

不需要调用,自己执行。

通常和匿名函数一起使用。

作用:

避免变量之间的污染。

语法:

()();

例如:image-20220401170428859

注意:

多个立即执行函数要用 ; 隔开,要不然会报错。

作用域(变量)

含义:

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域---只要是代码,就至少有一个作用域。

作用:

作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

全局作用域

声明在函数以及大括号外面的变量,在整个script标签内部或者一个独立的js文件都能访问和修改变量。

局部作用域

局部作用域也叫函数作用域,声明在函数内部的变量,只能在当前函数内部访问和修改变量。

块级作用域

声明在{}内部的变量,其实和函数作用域差不多,只能在当前的{}里面访问和修改变量。例如for、while循环。

三作用域演示:

<script>

        // 声明全局变量
        let a = 5;


        for (i = 1; i <= 1; i++) {
            // 声明块级变量
            let c = 7
            
            // 调用全局变量
            document.write(`块级内-全局变量值${a}`)//5
            // 调用局部变量
            document.write(`块级内-局部变量值${b}`)//报错,b是局部变量,只能在它那个作用域访问
            // 调用块级变量
            document.write(`块级内-块级变量值${c}`)//7
        }




        function arr() {
            // 声明局部变量
            let b = 6;

            // 调用全局变量
            document.write(`函数内-全局变量值${a}`)//5
            // 调用局部变量
            document.write(`函数内-局部变量值${b}`)//6
            // 调用块级变量
            document.write(`函数内-块级变量值${c}`)//报错,c是块级变量,只能在它那个作用域访问
        }

        // 调用函数
        arr()


        // 调用全局变量
        document.write(`全局内-全局变量值${a}`)//5
        // 调用局部变量
        document.write(`全局内-局部变量值${b}`)//报错,b是局部变量,只能在它那个作用域访问
        // 调用块级变量
        document.write(`全局内-块级变量值${c}`)//报错,c是块级变量,只能在它那个作用域访问

    </script>

作用域链(就近原则)

介绍:

代码寻找变量的一种机制。

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链。

原则:

一个位置调用了变量,那么变量值就为离它最近的作用域所声明的值(注意:调用的位置要和变量值在同一作用域里)。

注意:

1、如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看。

2、两个作用域里声明了同一个变量,不会报错。

3、变量值的判断依据是根据函数的定义来判断的,而不是根据函数调用来判断;

<script>

        let num = 100;
        function func1() {
            let num = 200;
            // 函数的调用 
            fun2();
        }



        // 函数的定义-声明 
        function fun2() {
            console.log(num);//num值为100
        }

        func1();//100
    </script>

总结

看思维导图,里面有大概括

地址[js基础知识 ProcessOn Mind]