四、函数

179 阅读3分钟

1. 什么是函数?

把特定功能的代码抽取为一个独立实体。

2. 函数的好处

  1. 代码的复用(通过函数名调用)
  2. 简短而清晰,提高可读性
  3. 方便维护和理解

3. 函数的分类

3.1 内置函数(系统函数)

Number()、parseInt()、Math.random()......

3.2 自定义函数

函数的语法:

    //1.定义函数
    function 函数名称(形参){
        //逻辑代码
        //返回值return
    }
    //2.调用函数,并且接收结果
    var res = 函数名称(实参);

【注】具体规则

  1. 函数必须用关键字function来定义

  2. 函数名称命名规则(和变量名命名规则一致):

    • ① 只能由数字、字母、下划线_、$组成;
    • ② 不能用数字开头;
    • ③ 不能是关键字保留字;
    • ④ 严格区分大小写;
    • ⑤ 驼峰命名法;
    • ⑥ 语义化。
  3. 形参(可写可不写):

    • ① 只是用来占位默认值undefined
    • 局部变量
    • ③ 只有在调用的时候,才能确定它的类型
    • ④ 形参个数,不影响函数本身
  4. 关键字 return(可写可不写):

    • 不写return关键字,函数默认返回undefined
    • return关键字用于返回结果,并且中断函数的执行
  5. 实参(可写可不写):实实在在的具体值

QQ图片20230324175019.jpg

4. 函数的3种写法

函数严格来说:先定义,后使用

4.1 普通函数。调用可以写在前面或者后面.(普通函数会预编译,提升到前面)

    fnA();
    function fnA(){
        return "我是普通函数";
    }

4.2 匿名函数。调用只能写在后面

    var fnB = function(){
        return "我是匿名函数";
    }
    fnB();

4.3 构造函数/创建函数。 js提供的内置的类 ---> Function

var fn = new Function("形参1","形参2","形参3"......,"函数体")
    var fnC = new Function("a","b","return a + b")
    fnC(1,2);

    //等价于
    function fnC(a,b){
        return a + b;
    }
    fnC(1,2);
    

5. arguments对象:

  • 作用:用于动态接收实参
  • 只能用于函数内部
  • 伪数组,实际上是一个对象
  • arguments.length来获取参数的个数
  • arguments[i] 的方式来访问数组中的第i个参数(i为下标,从0开始)

6. 作用域:

  1. 定义:变量的作用范围

(作用域补充链接zhuanlan.zhihu.com/p/438848875

  1. 分类:
    • ① 全局变量:函数外部的变量是全局变量
    • ② 局部变量:函数内部的变量是局部变量
    【注意】
    1. 不用var关键字声明变量,直接用 "=" 赋值是全局变量;(不推荐这么做,数据容易被污染)
    2. 当全局变量和局部变量同时存在,局部变量优先
    3. var声明的变量都会产生变量提升,发生预编译。

7. 作用域链:

定义:函数内部访问某个变量时,优先访问函数内部的局部变量,如果没有则一级一级往上找,直到全局变量,否则报错。

window是浏览器的宿主对象(顶级对象)。

8. 函数的嵌套:

  1. 兄弟函数之间可以相互访问
  2. 不能访问兄弟函数里面嵌套的局部函数

9. 事件驱动:

  1. 获取元素

var oBtn = document.getElementById("btn") ;//获取文档里的元素

  1. 绑定事件(用事件来驱动函数)

oBtn.onclick = fn ;//事件.onclick就像是给fn加了(),实现了调用函数。

10. 函数的递归调用

  1. 什么是递归?

    • ①函数自己调用自己
    • ②要有结束条件(临界值)
  2. 递归的使用场景:

    • ①循环能做的,递归都能实现(但递归性能不好,会不断压进栈和出栈)
    • ②多级菜单
    • ③后台管理系统建权
    • ④手写深度拷贝
    • ⑤快速排序