函数

初识函数

函数的概念

  • 把特定的代码片段抽取出来,成为独立运行的实体

函数的好处

  1. 可以重复使用
  2. 提高代码的可读性
  3. 有利于程序的维护

函数的分类

  • 分为系统函数(内置函数)和自定义函数

系统函数

  • 官方定义好的函数,可以直接调用
  • 如: alert(), isNaN(), console.log() ,document.write(), Boolean(), Math.pow()等

自定义函数

  • 是用户自己定义的函数, 用户可以根据实际需求, 对特定的功能使用函数来封装

函数的定义和调用

  • 定义函数的关键字是 function

声明式

php 复制代码
定义语法:
    function 函数名(形参1,形参2,形参3,...){
        函数体
    }
调用:
    函数名(实参1,实参2,实参3...)

例:
    //计算两数和
    function fn(num1,num2){
        return num1+num2
    }
    var res = fn(10,20)
    console.log(res)

【注】
    声明式定义的函数,可以在定义之前进行调用,因为js会进行预解析
    例:
        //计算两数和
        var res = fn(10,20)
        console.log(res)
        function fn(num1,num2){
            return num1+num2
        }

赋值式

php 复制代码
定义语法:
    var 函数名 = function(形参1,形参2,形参3,...){
        函数体  
    }

调用:
    函数名(实参1,实参2,..)

例:
    //计算两数和
    var fn = function(num1,num2){
        return num1+num2
    }
    var res = fn(10,20)
    console.log(res)
    
【注】
    只能在函数后面对函数进行调用

构造函数创建函数

  • 通过构造函数new Function()

    dart 复制代码
    语法:
        var 函数名 = new Function("形参1","形参2",...,"函数体"}
       
    调用:
        函数名(实参1,实参2,...)
    
    例:
        var show = new Function("a","b","c","return a+b+c")
        console.log(show(10,20,30))
    
    【注】 
        1、new Function的最后一个参数,是函数的函数体
        2、只能在定义函数之后,调用函数

注意事项

  1. 定义函数必须使用function关键字
  2. 函数名的命名规范与变量命名规范一致
  3. 形参:
    1. 默认值为undefined
    2. 是一个局部变量,只能在函数内部使用
  4. return关键字:
    1. 返回结果,并终止函数,在函数体中,return后面的代码不会被执行
    2. 函数体中不一定要有return,没有return就表示没有返回值
    3. 函数的返回值默认为undefined
  5. 实参:确定了形参的类型
  6. 函数只有被调用了才会执行

函数的参数

形参和实参

  • 形参:形式参数,声明函数的时候写在小括号里面的参数
  • 实参:实际参数,在函数调用的时候需要传递实际有值得参数
  • 规则:
    1. 实参个数 = 形参个数 : 挨个传递
    2. 实参个数 > 形参个数 : 多于的实参直接丢弃
    3. 实参个数 < 形参个数 : 多的形参值默认为undefined

arguments 类数组对象

  1. 是一个伪数组,有下标,不具备数组方法
  2. 它只能在函数内部出现
  3. 通过索引(下标)取值
    1. 取值的范围为0~arguments.length
    2. 取值方式arguments 索引 ( 下标 )
  4. 作用:可以动态接收实参

作用域和作用域链

变量的作用域

  • 作用域:变量作用的范围,可以分为全局变量和局部变量

全局变量

  • 在函数外面定义的变量
  • 在函数内部不使用var定义的变量
  • 作用范围为整个程序的执行范围

局部变量

  • 在函数内部通过var关键字定义的变量或者形参
  • 作用范围只在某个函数体内部
  • 在函数体内部,当局部变量与全局变量重名时,局部变量优先于全局变量

作用域链

  • 当函数内部访问某一个变量时候,首先去函数内部查找,如果内部没有,就向外层函数查找,如果外层函数,没有就向(浏览器像window)全局查找,这个"查找的过程"就叫做"作用域链"
  • 简单理解:内层环境中不断向外寻找变量和函数的过程

递归

  • 概念:程序调用自身的编程技巧称为递归
  • 运行的过程中不断的调用自己,本质就是循环
    • 注:不能无限制的调用自己,一定要有退出条件,避免死循环
js 复制代码
例:
function fn(n){
   if(n==1){
      return 1
    }
    return n * fn1(n-1)
}
console.log(fn(5))

解析图:

运行与与预解析

  1. 语法分析:查找基本语法有没有错误
  2. 预解析:在js代码执行之前进行预解析 将var和function提升到当前作用域的顶部

    变量的默认值为undefined,函数默认值为函数体

    当函数与变量重名时,保留函数

  3. 解释执行
相关推荐
可乐鸡翅yeah_2 小时前
FFmpeg 生成 HLS 独立分片 independent‑segments 参数到底有什么用
javascript·ffmpeg·音视频·safari·m3u8
福兮说2 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
Ai-_Man3 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
liangshanbo12154 小时前
JavaScript 异步核心主线
javascript·事件循环·异步操作
传人once5 小时前
悬停旋转放大和位移效果如何写
javascript·css·动画
默_笙6 小时前
🍔 中间件不只是打日志:四个钩子、一次短路,和自带的工具
前端·javascript
Dovis(誓平步青云)7 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
xieter7 小时前
【技术精选】TypeScript 高级类型体操:条件类型与模板字面量深度剖析 (2026-10-06)
javascript
ss2738 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
CappuccinoRose9 小时前
输入事件进阶
前端·javascript·输入事件