四、JS 基础知识之函数的作用域、匿名函数(2)

159 阅读2分钟

一、作用域

一般来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的 作用域

作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

image.png

1. 变量的作用域

在 JS 中根据作用域的不同,变量可以分为全局变量、局部变量、块级变量:

image.png

变量有一个特殊情况,如果函数内部或者块级作用域内部的变量没有声明,直接赋值,也当全局变量看,但是不推荐。

函数内部的形参可以看作是局部变量。

示例:

image.png

2. 变量访问原则

只要是代码就会有至少一个作用域。

如果写在函数内部的局部作用域中还有函数,那么在这个作用域中就又可以产生一个作用域。

根据在内部函数中可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为 作用域链

作用域链采取 就近原则 的方式来查找变量的最终值:

    <script>
      let num = 15

      function getName() {
        let num = 20

        function fun() {
          console.log(num)
        }
        fun()
      }
      getName()
    </script>

image.png

二、匿名函数

函数可以分为:

  • 具名函数 :function fn(){}
  • 匿名函数 :function(){}

1. 匿名函数的使用

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

语法:

image.png

调用:fn()

函数表达式的形参和实参的使用方式与具名函数的一致:

    <script>
      let name = function () {
        console.log('张三')
      }
      name()
    </script>
    <script>
      let name = function (num1, num2) {
        console.log(num1 + num2)
      }
      name(3, 9)
    </script>

2. 立即执行函数

立即执行函数可以避免全局变量之间的污染,语法:

image.png

立即执行函数如其名,不需要调用,立即执行。

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

分号一般写在函数开头,防止前面还有其它立即执行函数

    <script>
      ;(function () {
        let num = 18
        console.log(num)
      })()

      ;(function () {
        let num = 20
        console.log(num)
      }())
    </script>
    <script>
      ;(function (num1, num2) {
        console.log(num1 + num2)
      })(3, 5)
    </script>

image.png

时间转换实例:输入秒数,自动转换为时分秒

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      let mins = +prompt('请输入秒数:')
      function getTime(mins) {
        let hour = parseInt(mins / 60 / 60)
        let min = parseInt((mins / 60) % 60)
        let second = parseInt(mins % 60)

        hour = hour > 10 ? hour : '0' + hour
        min = min > 10 ? min : '0' + min
        second = second > 10 ? second : '0' + second

        document.write(`${hour}小时 ${min}分钟 ${second}秒`)
      }

      getTime(mins)
    </script>
  </body>
</html>

image.png