了解作用域对程序执行的影响及作用域链的查找机制,使用闭包函数创建隔离作用域避免全局变量污染。
作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问,作用域分为全局作用域和局部作用域。
局部作用域
函数作用域
在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
<script>// 声明 counter 函数function counter(x, y) {// 函数内部声明的变量let s = x + y;console.log(s); // 18}// 设用 counter 函数counter(10, 8);// 访问变量 sconsole.log(s); // 报错</script>
总结:
- 函数内部声明的变量,在函数外部无法被访问
- 函数的参数也是函数内部的局部变量
- 不同函数内部声明的变量无法互相访问
-
块作用域
在 JavaScript 中使用
{}包裹的代码称为代码块,代码块内部声明的变量外部将【有可能】无法被访问。<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声明的常量也会产生块作用域- 不同代码块之间的变量无法互相访问
- 推荐使用
let或const
注:开发中 let 和 const 经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用 const 声明成常量。
| 关键字 | 块级作用域 | 变量提升 | 初始值 | 更改值 | 通过window调用 |
|---|---|---|---|---|---|
| let | √ | ×√ | - | Yes | No |
| const | √ | ×√ | Yes | No | No |
| var | × | √ | - | Yes | Yes |
