什么是作用域 什么是作用域链

作用域

作用域简单来说就是变量能够访问的范围,离开了这个范围就不能被访问 ,作用域分为全局作用域  局部作用域 和块级作用域

全局作用与域 :是指在script标签内 在此声明的函数 在函数内部也可以被访问

局部作用域:局部作用域分为函数作用域和块级作用域

函数作用域:  在函数内部声明的只有在函数内部才能被访问

 

<script>
  // 声明 counter 函数
  function counter(x, y) {
    // 函数内部声明的变量
    const s = x + y
    console.log(s) // 18
  }
  // 设用 counter 函数
  counter(10, 8)
  // 访问变量 s
  console.log(s)// 报错
</script>

 

总结:

  1. 函数内部声明的变量,在函数外部无法被访问

  2. 函数的参数也是函数内部的局部变量

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

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

 

块级作用域:let const 声明的 使用{}包裹的称为块级作用域  代码块内部声明的变量外部有可能无法访问

<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>

总结:

  1. let 声明的变量会产生块作用域,var 不会产生块作用域

  2. const 声明的常量也会产生块作用域

  3. 不同代码块之间的变量无法互相访问

  4. 推荐使用 letconst

  5. 注:开发中 letconst 经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用 const 声明成常量。

作用域链

作用域的本质就是底层变量的查找机制  在函数执行时会优先在当前作用域中查找 如果当前作用域中查找不到 就向外层作用域中查找 这样一层层查找就形成了作用域链

posted @ 2022-11-24 13:33  噢噢噢J  阅读(138)  评论(0编辑  收藏  举报