在JS世界中一共有三种作用域

  1. 全局作用域
  2. 函数作用域
  3. 块作用域

全局作用域

声明在任何函数之外的顶层作用域的变量就是全局变量,这样的变量拥有全局作用域:

  1. var name = 'zhangsan'; // 全局作用域内的变量
  2. // 函数作用域
  3. function showName() {
  4. console.log(name);
  5. }
  6. // 块作用域
  7. {
  8. name = 'lisi'
  9. }
  10. showName(); // 输出 'lisi'

函数作用域

在函数内部定义的变量,拥有函数作用域:

  1. var name = '张三';// name 是全局变量
  2. function showName(myName) {
  3. // myName 是传入 showName 的局部变量
  4. console.log(myName);
  5. }
  6. function sayHello() {
  7. // hello 被定义成局部作用域变量
  8. var helloString = 'hello 张三';
  9. console.log(helloString);
  10. }
  11. showName(name); // 输出 '张三'
  12. sayHello(); // 输出 'hello 张三'
  13. console.log(myName); // 抛出错误:myName 在全局作用域未定义
  14. console.log(helloString);// 抛出错误:hello 在全局作用域未定义
  15. {
  16. console.log(helloString, myName) // 抛出错误
  17. }

块级作用域

ES6 开始,我们迎来了了两个用于声明变量的新关键词: let 和 const 。这两个关键字定义的变量,如果被一个大
括号 { } 这样括住了,那么这个大括号就是一个代码块,大括号括住的这些变量就形成了一个块作用域:

  1. {
  2. let a = 1;
  3. console.log(a);
  4. }
  5. console.log(a); // 报错 function showA()
  6. {
  7. console.log(a) // 报错
  8. }

在这个例子里我们可以看出,块作用域内的变量只要出了自己被定义的那个代码块,那么就无法访问了。这点和函
数作用域比较相似它们都只在 自己的作用域块 上生效,所以它们也统称为” 局部作用域