函数
函数的定义与使用
概念:把特定功能的代码抽取出来,使之成为程序中的一个独立实体
作用:将特定的功能进行封装(可以通过调用,多次重复使用);
优点:减少了冗余代码,提高了代码的可维护性与可读性
分类:系统函数(官方提供):window里面的所有函数(console.log(), alert(),prompt()....)
内置函数(官方提供):所有的内置对象里面的函数(Math.pow()...)
自定义函数:自己定义
系统函数和内置函数更关注于它们的使用,自定义函数(定义以及使用)
注意:
-
必须使用function关键字,且为小写
-
函数名命名规则与变量名命名规则保持一致
-
函数名后必须加()
-
使用函数必须调用
自定义函数的定义以及调用
1.使用function关键词 定义匿名函数(没有名字的函数)
function(形参 可以省略 可以有多个){ //代码块 } //函数后面要带括号() 自执行的函数,没有复用性价值 (function(){ console.log('你好'); })()
2.使用function关键词 定义具名函数(有名字的函数)
//声明1 function 函数名(形参1,形参2,...){ //代码块 } //变种声明 var 函数名 = function(){ //代码块 } //调用 函数名(参数,参数);
function 和 var 关键词在预编译阶段就会声明,但是var关键词修饰的变量赋值发生在预编译之后
3.使用new Function方式
var 函数名 = new Function('形参','形参1','函数体(代码)');
函数参数
形参:函数定义时,()内的参数 在整个函数体内都可以使用。形参相当于定义在函数内部的变量,是形式上存在的(即声明了没赋值)
实参:函数调用时,()内的参数 实参是具体的值
arguments数组(伪数组 实际是个对象):当我们调用函数,往函数传送参数时,函数接收到参数后,会将参数保存在arguments数组中
arguments数组:计算数组中有多少个参数,用arguments.length获取;
需要数组内的第i个数值:arguments[i]
注意:只能实参传送给形参,形参不能传送给实参;当形参发生改变时,实参并不会变化
函数执行过程
- 把对应的function内存里面的代码块丢给方法栈(执行栈)去执行
- 执行栈会自动执行对应的函数,执行完返回对应的结果
- 当结果返回完毕后,对应的执行栈里的内存空间进行回收(GC)
在程序执行之前有个编译过程
预编译会做的事情
-
会声明对应的function 和var关键词修饰的变量(开辟内存的操作)
-
对应的function的内存空间开辟以后会将对应的代码块放到其中,等待被调用
-
var 修饰的关键词 只会开辟一个空间,并不会进行赋值(默认为undefined)
函数返回值
函数都有一条return语句,return语句导致函数停止执行,并返回它的表达式的值给调用者。
如果return语句没有相关的表达式,则返回undefined。
return 关键词
返回对应的数据,在函数内进行数据返回,使用了return后面的内容不再执行
函数如果没有用return返回值,则会默认返回一个undefined
递归函数
概念:是在一个函数通过名字调用自身情况下构成的,即函数内部调用函数本身
递归三要素:找规律,找临界值,调用自身
不推荐使用,主要用于文件的遍历,菜单遍历,深拷贝
作用域
全局变量:定义在函数外部的变量,在任何函数中都有效,作用域范围为当前文件
局部变量:定义在函数内部的变量,只在该函数内有效(形参也为局部变量)
作用域:作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
局部作用域:函数作用域
作用域链
当执行函数时,总是先从函数内部找寻局部变量如果内部找不到(函数的局部作用域没有),
则会向创建函数的作用域(声明函数的作用域)寻找,依次向上查找。
寻找的这个过程构成的链式结构就叫做作用域链。
函数的嵌套
函数内部包含其他函数
调用外层函数时不会自动调用内层函数,需要在外层函数内调用内层函数。
函数之间允许相互调用,也允许向外调用, 但是不可以调用同级函数的嵌套函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗