作用域
-
作用域:简单来说,变量的可用范围, 在代码中定义的变量区域,决定了变量的可访问性
-
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
目前已经有了三种作用域:
- 全局作用域
- 函数作用域
- 块作用域
全局作用域
- 全局作用域下声明的变量可以在程序的任意位置访问
var name = 'xiuyan'; // 全局作用域内的变量
// 函数作用域
function showName() {
console.log(name);
}
// 块作用域
{
name = 'BigBear'
}
showName(); // 输出 'BigBear'
上面这个例子我们可以看出,全局变量在全局作用域、函数作用域和块作用域里都可以获取到
函数作用域
- 在函数内部定义的变量,拥有函数作用域。
var name = 'xiuyan'; // name 是全局变量
function showName(myName) {
// myName 是传入 showName 的局部变量
console.log(myName);
}
function sayHello() {
// hello 被定义成局部作用域变量
var helloString = 'hello everyone';
console.log(helloString);
}
showName(name); // 输出 'xiuyan'
sayHello(); // 输出 'hello everyone'
console.log(myName); // 抛出错误:myName 在全局作用域未定义
console.log(helloString); // 抛出错误:hello 在全局作用域未定义
块作用域
-
块级作用域可通过新增命令 let 和 const 声明
-
所声明的变量只能在当前块的作用域才能访问
块级作用域在如下情况被创建:
- 函数的内部
function getValue(condition) {
if (condition) {
let value = "blue";
return value;
} else {
// value 在此处不可用
return null;
}
// value 在此处不可用
}
- 在一个代码块,(由一对花括号包裹)内部
const a = 2;
{
const a = 1;
}
console.log(a); //2
作用域链
-
作用域链,是由当前环境与外部环境的一系列变量对象组成
-
访问一个变量时,会首先在当前的作用域查找,如果没找到,就去父级作用域去查找,直到找到该变量或者不存在父级作用域中,这样的链路就是作用域链
但是如果在当前作用域中没有查到值,去外部环境寻找变量。一层一层的找,直到找到全局作用域执行上下文,如果没有就报错。如果有,就打印结果。
那整个的变量寻找的过程就是整个的作用域链了