函数

初识函数

函数的概念

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

函数的好处

  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. 解释执行
相关推荐
ZXT3 小时前
js基础重点复习
javascript
言兴3 小时前
秋招面试---性能优化(良子大胃袋)
前端·javascript·面试
WebInfra5 小时前
Rspack 1.5 发布:十大新特性速览
前端·javascript·github
雾恋5 小时前
我用 trae 写了一个菜谱小程序(灶搭子)
前端·javascript·uni-app
烛阴6 小时前
TypeScript 中的 `&` 运算符:从入门、踩坑到最佳实践
前端·javascript·typescript
Java 码农7 小时前
nodejs koa留言板案例开发
前端·javascript·npm·node.js
ZhuAiQuan7 小时前
[electron]开发环境驱动识别失败
前端·javascript·electron
nyf_unknown7 小时前
(vue)将dify和ragflow页面嵌入到vue3项目
前端·javascript·vue.js
胡gh7 小时前
数组开会:splice说它要动刀,map说它只想看看。
javascript·后端·面试
TimelessHaze8 小时前
🔥 一文掌握 JavaScript 数组方法(2025 全面指南):分类解析 × 业务场景 × 易错点
前端·javascript·trae