什么是函数

说明

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

优点

  1. 函数具有“一次定义,多次调用”的优点
  2. 使用函数,可以简化问题,让代码更具有可读性

函数的定义和调用

声明函数

  1. function是声明函数的关键字
  2. 函数是做某件事情,所以函数名一般是动词( 前缀应该为动词 )。
  3. 函数不调用自己不执行, 使用 () 调用函数

    第一种 利用函数关键字命名函数

    1. function 函数名() {}

第二种 函数表达式

  • 变量名是变量名,不是函数名
  • 跟声明变量差不多,只不过声明函数里面存的是函数
  • 函数表达式可以参数
    1. let 变量名 = function() {}

调用函数

函数名();

函数的封装

说明

  1. 就是把一个或多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口。

函数传参

说明

  1. 若函数完成功能需要调用者传入数据,那么就需要用有参数的函数
  2. 这样可以极大提高函数的灵活性
  3. 形参: 声明函数时写在函数名右边小括号里的叫形参(形式上的参数)
  4. 实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)
    1. function 函数名(参数列表) { //传入数据列表 声明这个函数需要传入几个数据,多个数据用逗号隔开
    2. 函数体
    3. }

作用

在函数内部某些值不能固定,可以通过参数再调用函数时传递不同的值进去

注意

  • 在函数名调用的括号里面是实参
  • 形参是接受实参的
  • 函数的参数可有可无
  • 形参的默认值是undefined
  • 尽量让实参的个数和形参的个数相匹配
  • 形参也可以看作是变量
    形参与实参的匹配问题
    | 参数个数 | 结果 | | —- | —- | | 实参 = 形参 | 正确输出结果 | | 形参 < 实参 | 报错,未定义 | | 实参 < 形参 | 多的形参定义为undefined,undefined进行任何运算结果都是NaN |

函数的返回值

说明

  1. 利用return终止函数,return后面的语句不会再执行。
  2. 简单来说: 函数内部不需要 输出结果,而是返回结果
  3. 在函数中使用return时,return只能返回一个值。当需要返回多个值,可以使用数组来实现。
  4. 不能执行多个return,只有第一个return生效
  5. 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
  6. 函数可以没有 return,这种情况函数默认返回值为 undefined
  7. 函数有return必须要用变量来接收,再输出

匿名函数

函数可以分为 具名函数 和 匿名函数

  1. //具名函数
  2. 声明:function fn() {}
  3. 调用:fn()
  4. //匿名函数
  5. function() {}

说明

  1. 将匿名函数**赋值给一个变量**,并且**通过变量名称进行调用**我们将这个称为**函数表达式**

写法

  1. let fn = function () {}
  2. //调用
  3. fn() //函数名()

立即执行函数

避免全局变量之间的污染

不需要调用立即执行

多个立即执行函数要用分号(;)隔开,不然会报错

语法
  1. 方式一
  2. (function () {console.log(2) })()
  3. 方式二
  4. (function () {console.log(2) }())

JS作用域

说明

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

全局作用域

全局有效

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

局部作用域

局部有效

作用于函数内的代码环境,就是局部作用域。

因为跟函数有关系,所以也称为函数作用域

块级作用域

{} 内有效

块作用域由 { } 包括,if语 句和for语句里面的{ }等 。

变量的作用域

如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐 但是有一种情况,函数内部的形参可以看做是局部变量。

全局变量

函数外部let 的变量

在任何区域都可以访问和修改

局部变量

函数内部let的变量

局部变量只能在当前函 数内部访问和修改

块级变量

{} 内部的let变量

let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问

作用域链

函数内部访问外部函数的变量,采用的是链式查找的方法决定取哪个值(就近原则)。

案例

  1. //用户输入秒数,获得指定格式,个位数前面补0
  2. function getTime() {
  3. // 用户输入秒数
  4. let seconds = +prompt("请输入秒数");
  5. // 获取时
  6. let h = parseInt(seconds / 60 / 60 % 24);
  7. // 获取分
  8. let m = parseInt(seconds / 60 % 60);
  9. // 获取秒
  10. let s = parseInt(seconds % 60);
  11. // 补零
  12. h = h < 10 ? '0' + h : h;
  13. m = m < 10 ? '0' + m : m;
  14. s = s < 10 ? '0' + s : s;
  15. console.log(`${seconds}秒等于${h}时${m}分${s}秒`); //假设总秒数为1000秒,输出 1000秒等于00时16分40秒
  16. }
  17. getTime() //1000秒等于00时16分40秒