JavaScript三座大山之作用域

62 阅读1分钟

种一棵树,时间最好是十年前,其次是现在

什么是作用域

  • 作用域是用来管理变量函数可访问范围的一种机制也就是作用域链机制

作用域链

  • 规定了变量和函数在不同作用域中的查找方式。这种方式是由自身域向上层查找

全局作用域

  • 全局作用域也被称为顶级作用域代表,我们在所定义的函数和变量在任何位置都可以被访问。
  • 带来的问题: 命名冲突、变量污染等。

函数作用域

  • 函数作用域是指在函数内部定义的变量和函数,外部无法访问,只能在函数内部访问。
  • 解决的问题:比如变量污染和命名冲突, 并且函数执行完毕后函数内部所有变量存会被销毁。

块级作用域

  • 块级作用域是 ES6之后使用 letconst 声明的变量所在的范围。
  • 解决了var 声明变量所带来的一些问题,比如变量提升
    if (true) {
      let num = 1
    }
    console.log(num);  // 报错 num is not defined

也就是在 { }内使用letconst 声明变量 此时{ }内就是一个块级作用域外部无法访问

看这段代码

    let num = 10
    fn_scope()
    function fn_scope() {
      let num = 20
      fn1_scope()
    }

    function fn1_scope() {
      console.log(num); // 这里打印为 10
    }

这里fn1_scope所i访问的num查找的顺序为由自身所在的作用域向上查找也就是全局的作用域中的num ,它不取决于在哪里调用而是在哪里声明,这跟JavaScript的执行上下文(埋坑)有关