作用域
- 是什么?
是变量和函数生效的区域或者集合
局部作用域
-
函数作用域
-
函数内部声明的变量,外部无法直接访问;
-
函数的参数也是函数内部的局部变量;
-
不同函数内部声明的变量无法互相访问
-
函数执行完毕后,函数内部的变量实际被清空了
<script> // 声明 counter 函数 function counter(x, y) { // 函数内部声明的变量 const s = x + y console.log(s) // 18 } // 设用 counter 函数 counter(10, 8) // 访问变量 s console.log(s)// 报错 </script>
-
-
块作用域:被{}包裹的代码叫代码块,代码块 内部声明的 变量外部有可能无法被访问
<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
-
注:开发中
let
和const
经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用const
声明成常量。
全局作用域
-
<script>
标签和.js
文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。<script> // 此处是全局 function sayHi() { // 此处为局部 } // 此处为全局 </script>
-
全局作用域声明的变量,其他作用域可以使用
-
尽可能少的 声明 全局变量,防止全局变量被 污染
作用域链(面试题)(重点)
-
本质:底层的变量 查找机制
<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>
-
规则:
- 优先查找当前 函数 作用域中 查找 变量
- 查找不到 会 依次 逐级 查找 父级作用域 直到 全局作用域
-
就近原则,按照从小到大的规则 查找
-
子作用域可以访问父作用域,反之则不可以