JavaScript——函数

一. 函数的概念

在 JS 里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。

虽然 for循环语句也能实现一些简单的重复操作,但是比较具有局限性,此时我们就可以使用 JS 中的函数。

函数:就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。

二. 函数的使用

函数在使用时分为两步:声明函数和调用函数

2.1 声明函数

在这里插入图片描述
在这里插入图片描述

2.2 调用函数

在这里插入图片描述
在这里插入图片描述
注意:声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。

2.3 函数的封装

在这里插入图片描述

三. 函数的参数

1. 形参和实参

在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参。

在这里插入图片描述
参数的作用 : 在函数内部某些值不能固定,我们可以通过参数在调用函数时传递不同的值进去

在这里插入图片描述

2. 函数参数的传递过程

在这里插入图片描述

3. 函数形参和实参个数不匹配问题

在这里插入图片描述
在这里插入图片描述
注意:在JavaScript中,形参的默认值是undefined

四. 函数的返回值

1. return 语句

有的时候,我们会希望函数将值返回给调用者,此时通过使用 return 语句就可以实现

return 语句的语法格式如下:
在这里插入图片描述

  • 在使用 return 语句时,函数会停止执行,并返回指定的值
  • 如果函数没有 return ,返回的值是 undefined

在这里插入图片描述

2. return 终止函数

return 语句之后的代码不被执行。
在这里插入图片描述

3. return 的返回值

return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准。

在这里插入图片描述

4. 函数没有 return 返回 undefine

函数都是有返回值的

  1. 如果有return 则返回 return 后面的值
  2. 如果没有return 则返回 undefine

5. break ,continue ,return 的区别

  • break :结束当前的循环体(如 for、while)
  • continue :跳出本次循环,继续执行下次循环(如 for、while)
  • return :不仅可以退出循环,还能够返回 return 语句中的值,同时还可以结束当前的函数体内的代码

五. arguments的使用

当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参

在这里插入图片描述
在这里插入图片描述

六. 函数的两种声明方式

1. 自定义函数方式(命名函数)

利用函数关键字 function 自定义函数方式。
在这里插入图片描述

  • 因为有名字,所以也被称为命名函数
  • 调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面

2. 函数表达式方式(匿名函数)

利用函数表达式方式的写法如下:
在这里插入图片描述

  • 因为函数没有名字,所以也被称为匿名函数
  • 这个fn 里面存储的是一个函数
  • 函数表达式方式原理跟声明变量方式是一致的
  • 函数调用的代码必须写到函数体后面

七. 作用域

1. 概述

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

在这里插入图片描述

1.1 分类

全局作用域

  • 作用于所有代码执行的环境 ( 整个 script 标签内部 ) 或者一个独立的 js 文件。

局部作用域 (函数作用域)

  • 作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域。

1.2 JS 没有块级作用域

  • 块作用域由 { } 包括。

  • 在其他编程语言中(如 java 、 c# 等),在 if 语句、循环语句中创建的变量,仅仅只能在本 if 语句、本循环语句中使用,如下面的 Java 代码

    在这里插入图片描述

  • Js 中没有块级作用域(在 ES6 之前)
    在这里插入图片描述

2. 变量的作用域

2.1 变量作用域的分类

在这里插入图片描述

2.2 全局变量

在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)。

  • 全局变量在代码的任何位置都可以使用
  • 在全局作用域下 var 声明的变量 是全局变量
  • 特殊情况下,在函数内不使用 var 声明的变量也是全局变量(不建议使用)

2.3 局部变量

在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)

  • 局部变量只能在该函数内部使用
  • 在函数内部 var 声明的变量是局部变量
  • 函数的形参实际上就是局部变量

2.4 全局变量和局部变量的区别

  • 全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
  • 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间

3. 作用域链

  • 只要是代码,就至少有一个作用域
  • 写在函数内部的局部作用域
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  • 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链

在这里插入图片描述
在这里插入图片描述
作用域链:采取就近原则的方式来查找变量最终的值

八. 预解析

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。 JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行

在这里插入图片描述

1. 变量预解析(变量提升)

预解析也叫做变量、函数提升。

  • 变量提升: 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升
    在这里插入图片描述

2. 函数预解析(函数提升)

函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。
在这里插入图片描述

3. 解决函数表达式声明调用问题

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值