函数

初识函数

函数的概念

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

函数的好处

  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. 解释执行
相关推荐
三月七(爱看动漫的程序员)7 小时前
模型/O功能之提示词模板
java·前端·javascript·人工智能·语言模型·langchain·prompt
LCG元7 小时前
Vue.js组件开发-实现左侧浮动菜单跟随页面滚动
前端·javascript·vue.js
小郑T_T10 小时前
浏览器模块化难题
前端·javascript
微光守望者11 小时前
Node.js常用知识
前端·javascript·node.js
濡湿小镰刀12 小时前
在谷歌插件中拦截并修改请求参数
javascript
解道Jdon13 小时前
杨立昆退休?中国Deepseek超Llama 4触发Meta
javascript·reactjs
不做超级小白16 小时前
JavaScript反爬技术解析与应对
开发语言·javascript·ecmascript
engchina17 小时前
使用Express.js和SQLite3构建简单TODO应用的后端API
javascript·sqlite·express
prince_zxill18 小时前
Array.prototype 方法在复杂数据处理中的应用
前端·javascript·原型模式
键.18 小时前
react-bn-面试
javascript·react.js·ecmascript