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