函数

128 阅读6分钟

函数

为什么需要函数? 函数使用 函数传参 函数返回值 作用域 匿名函数

*1 为什么需要函数

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

说明: 函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。

简单点说:1:简化代码 2:方便复用 3:封装功能

函数使用

函数的声明语法:

image.png

例如:

function sayHi(){
          document.write('hai..')
      }

函数名命名规范

  1. 和变量命名基本一致
  2. 尽量小驼峰式命名法
  3. 前缀应该为动词
  4. 命名建议:常用动词约定
动词含义
can判断是否可执行某个动作
has判断是否含义某个值
is判断是否为某个值
get获取某个值
set设置某个值
load加载某些数据

函数的调用

函数的调用语法

image.png

注意:声明(定义)的函数必须调用才会真正被执行,使用 () 调用函数

例:

image.png

  • 调用的时候千万不要忘记添加小括号
  • 口诀:函数不要调用,自己不执行

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

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

image.png

函数传参

  1. 为什么要有参数的函数

    :这样的函数只能求 10 + 20, 这个函数功能局限非常大

image.png

解决办法:把要计算的数字传到函数内

结论:

  1. 若函数完成功能需要调用者传入数据,那么就需要用有参数的函数
  2. 这样可以极大提高函数的灵活性

2 有参数的函数声明和调用

调用语法:

image.png

例:

image.png

image.png

image.png

注意:调用函数时,需要传入几个数据就写几个,用逗号隔开

有参数的函数声明和调用

调用语法:

image.png

例:

image.png

image.png

image.png

调用函数时,需要传入几个数据就写几个,用逗号隔开

形参和实参

image.png

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

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

  • 形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值

  • 开发中尽量保持形参和实参个数一致

    在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时, 同样也需要传递相应的参数,这些参数被称为实参

    参数说明
    形参形式上的参数 函数定义的时候 传递的参数 当前并不知道是什么
    实参实际上的参数 函数调用的时候传递的参数 实参是传递给形参的

    函数形参和实参个数不匹配问题

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

代码示例1:

<script>//num1 和num2 都是形式参数
        function getSum(num1,num2){
            document.write(num1+num2)  
        }
        //这里的1和5都是咱们的实际参数
        //1.如果是实参的个数和形参的个数一致,则正常输出结果
        getSum(1,5)
        //2.如果实参数的个数大于形参的个数 多出来的实参 不会被接受 则不会参与运算
        getSum(1,2,3)
        //3.如果实参数的个数小于形参的个数  多余的形参定义为undefined  最终的结果是NaN
        //形参可以看作不用声明的变量 num2是一个变量 但没有接收值 结果是undefined
        getSum(5)   //NaN
        
        //任何数字型加undefined 返回结果都是Nan
        //注意:我们尽量让实参的个数与形参的个数匹配
    </script>

函数返回值

为什么要让函数有返回值

:回到问题的根本是什么是函数?

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

:执行完特定任务之后,然后呢? 把任务的结果给我们

缺点:把计算后的结果处理方式写死了,内部处理了

解决:把处理结果返回给调用者

有返回值函数的概念: 当调用某个函数,这个函数会返回一个结果出来 这就是有返回值的函数

用return返回数据

当函数需要返回数据出去时,用return关键字

语法:

image.png

怎么使用呢?

image.png 代码示例1:

<script>
        function getNum(){
            return 888;
        }
        getNum();  // getNum() = 888
        document.write(getNum())


        function getFood(are){
            return are
        }
        document.write(getFood('大肘子'))

        //求两个数的和 完美写法
        function getSum(num1,num2){
            return num1+num2
           
        }
        document.write(getSum(8,2))
    </script>

代码示例2:

<script>
        //04-函数返回值 求最大值
        function getMax(num1,num2){
            if(num1>num2){
                return num1
            }else{return num2}
        }
        document.write(getMax(8,10))
        document.write(getMax(99,1))

        //第二种写法 利用三元运算符  更加简洁
        function getMax(num1,num2){
            return num1>num2? num1:num2
        }
        document.write(getMax(33,44))
    </script>

代码示例3:

<script>
        //需求:利用函数求任意一个数组中的最大值
        //求[5,2,99,101,67,77]中的最大值
        function getMax(num){  //接收一个数组
           
            let max=num[0]

            for (let i = 0; i< num.length; i++) {
             if(num[i]>max){
                 max=num[i]
             }
                
            }
            return max;
        }
        document.write(getMax([5,2,99,101,67,77]))  //实参是一个数组
    </script>

细节:

  • 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
  • 函数内部只能运行到 1 次 return,并且 return 后面代码不会再被执行,所以 return 后面的数据不要换行写
  • return会立即结束当前函数
  • 函数可以没有 return,这种情况函数默认返回值为 undefined

作用域

  1. 作用域概述

    • 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

image.png

全局作用域:直接写在script标签内的代码

​ 全局变量 任意的地方都可以访问

函数作用域*局部作用域:写在函数内部中的变量

​ 只能在自己的大括号中使用

块级作用域:块作用域由 { } 包括,if while语句和for语句里面的{ }等 在这里面定义的变量

变量作用域特殊情况:

  • 如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
  • 函数内部的形参可以看做是局部变量,所以形参相当于函数内部定义的局部变量,只有在函数内部可以使用

变量访问原则-作用域链

  • 只要是代码,就至少有一个作用域
  • 写在函数内部的局部作用域
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  • 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链

作用域链 :只是一种代码寻找变量来执行 机制 规则

​ 就近的参照物是 函数的声明,函数的定义来寻找最近的变量

image.png

image.png

image.png

匿名函数

匿名函数

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

语法:

image.png

调用:

image.png 其中函数的形参和实参使用跟具名函数一致

自执行函数

  1. 作用 :防止变量污染
  2. 特点 : 在定义函数的同时也执行函数
  3. 代码 : (匿名函数)()