在JS世界中一共有三种作用域
- 全局作用域
- 函数作用域
- 块作用域
全局作用域
声明在任何函数之外的顶层作用域的变量就是全局变量,这样的变量拥有全局作用域:
var name = 'zhangsan'; // 全局作用域内的变量// 函数作用域function showName() {console.log(name);}// 块作用域{name = 'lisi'}showName(); // 输出 'lisi'
函数作用域
在函数内部定义的变量,拥有函数作用域:
var name = '张三';// name 是全局变量function showName(myName) {// myName 是传入 showName 的局部变量console.log(myName);}function sayHello() {// hello 被定义成局部作用域变量var helloString = 'hello 张三';console.log(helloString);}showName(name); // 输出 '张三'sayHello(); // 输出 'hello 张三'console.log(myName); // 抛出错误:myName 在全局作用域未定义console.log(helloString);// 抛出错误:hello 在全局作用域未定义{console.log(helloString, myName) // 抛出错误}
块级作用域
ES6 开始,我们迎来了了两个用于声明变量的新关键词: let 和 const 。这两个关键字定义的变量,如果被一个大
括号 { } 这样括住了,那么这个大括号就是一个代码块,大括号括住的这些变量就形成了一个块作用域:
{let a = 1;console.log(a);}console.log(a); // 报错 function showA(){console.log(a) // 报错}
在这个例子里我们可以看出,块作用域内的变量只要出了自己被定义的那个代码块,那么就无法访问了。这点和函
数作用域比较相似它们都只在 自己的作用域块 上生效,所以它们也统称为” 局部作用域
