函数

函数的定义与使用

  概念:把特定功能的代码抽取出来,使之成为程序中的一个独立实体

  作用:将特定的功能进行封装(可以通过调用,多次重复使用);

  优点:减少了冗余代码,提高了代码的可维护性与可读性

  分类:系统函数(官方提供):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

递归函数

  概念:是在一个函数通过名字调用自身情况下构成的,即函数内部调用函数本身

  递归三要素:找规律,找临界值,调用自身

  不推荐使用,主要用于文件的遍历,菜单遍历,深拷贝 

作用域

  全局变量:定义在函数外部的变量,在任何函数中都有效,作用域范围为当前文件

  局部变量:定义在函数内部的变量,只在该函数内有效(形参也为局部变量)

  作用域:作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。

  局部作用域:函数作用域

作用域链

  当执行函数时,总是先从函数内部找寻局部变量如果内部找不到(函数的局部作用域没有),

则会向创建函数的作用域(声明函数的作用域)寻找,依次向上查找。

寻找的这个过程构成的链式结构就叫做作用域链。

函数的嵌套

  函数内部包含其他函数

  调用外层函数时不会自动调用内层函数,需要在外层函数内调用内层函数。

  函数之间允许相互调用,也允许向外调用, 但是不可以调用同级函数的嵌套函数

 

posted @   啊呀阿鱼呀  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示