一片关于 JavaScript 中作用域的理解 ~~~

作用域

  1. 是什么?
    是变量和函数生效的区域或者集合

局部作用域

  1. 函数作用域

    • 函数内部声明的变量,外部无法直接访问;

    • 函数的参数也是函数内部的局部变量;

    • 不同函数内部声明的变量无法互相访问

    • 函数执行完毕后,函数内部的变量实际被清空了

      <script>
        // 声明 counter 函数
        function counter(x, y) {
          // 函数内部声明的变量
          const s = x + y
          console.log(s) // 18
        }
        // 设用 counter 函数
        counter(10, 8)
        // 访问变量 s
        console.log(s)// 报错
      </script>
      
  2. 块作用域:被{}包裹的代码叫代码块,代码块 内部声明的 变量外部有可能无法被访问

    <script>
      {
        // age 只能在该代码块中被访问
        let age = 18;
        console.log(age); // 正常
      }
      
      // 超出了 age 的作用域
      console.log(age) // 报错
      
      let flag = true;
      if(flag) {
        // str 只能在该代码块中被访问
        let str = 'hello world!'
        console.log(str); // 正常
      }
      
      // 超出了 age 的作用域
      console.log(str); // 报错
      
      for(let t = 1; t <= 6; t++) {
        // t 只能在该代码块中被访问
        console.log(t); // 正常
      }
      
      // 超出了 t 的作用域
      console.log(t); // 报错
    </script>
    

    JavaScript 中除了变量外还有常量,常量与变量本质的区别是【常量必须要有值且不允许被重新赋值】,常量值为对象时其属性和方法允许重新赋值。

    <script>
      // 必须要有值
      const version = '1.0.0';
    
      // 不能重新赋值
      // version = '1.0.1';
    
      // 常量值为对象类型
      const user = {
        name: '小明',
        age: 18
      }
    
      // 不能重新赋值
      user = {};
    
      // 属性和方法允许被修改
      user.name = '小小明';
      user.gender = '男';
    </script>
    
    • let声明的变量会产生块作用域,var 不会产生
    • const声明的 会 产生
    • 不同 代码块 之间的变量 无法 互相访问
    • 一般不要 用 var,用let const
  3. 注:开发中 letconst 经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用 const 声明成常量。

全局作用域

  1. <script> 标签和 .js 文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。

    <script>
      // 此处是全局
      
      function sayHi() {
        // 此处为局部
      }
    
      // 此处为全局
    </script>
    
  2. 全局作用域声明的变量,其他作用域可以使用

  3. 尽可能少的 声明 全局变量,防止全局变量被 污染

作用域链(面试题)(重点)

  1. 本质:底层的变量 查找机制

    <script>
      // 全局作用域
      let a = 1
      let b = 2
    
      // 局部作用域
      function f() {
        let c
        // let a = 10;
        console.log(a) // 1 或 10
        console.log(d) // 报错
        
        // 局部作用域
        function g() {
          let d = 'yo'
          // let b = 20;
          console.log(b) // 2 或 20
        }
        
        // 调用 g 函数
        g()
      }
    
      console.log(c) // 报错
      console.log(d) // 报错
      
      f();
    </script>
    
  2. 规则:

    • 优先查找当前 函数 作用域中 查找 变量
    • 查找不到 会 依次 逐级 查找 父级作用域 直到 全局作用域
  3. 就近原则,按照从小到大的规则 查找

  4. 子作用域可以访问父作用域,反之则不可以

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值