1.什么是作用域链
1.1 概念
作用域链其实就是代码在执行过程中创建变量的一个作用域链,保证对执行环境有权访问的所有变量和函数可以有序的访问。
1.2 规则
内部环境可以通过作用域链访问外部,而外部不能访问内部。
var color = 'red';
function change() {
var changeColor = 'blue';
console.log(color); //red
console.log(changeColor); //blue
console.log(otherColor); //not defined
function other() {
var otherColor = 'yellow'
console.log(color,changeColor,otherColor) //red blue yellow
}
other()
}
change()
console.log(color); //red
console.log(changeColor); //not defined
console.log(otherColor); //not defined
根据上面代码的执行结果,我们可以看到越是内层的函数,可以访问到的变量越多,其实就是因为内部的函数可以通过作用域链逐级向上访问,一直到全局,而最外层却只能访问到全局的变量,内部函数的变量却无法访问到。
1.3 查询标识符
从作用域前端,向上逐级查询给定名字匹配的标识符。实质上还是沿着作用域链从内向外去查找与给定名字匹配的标识符
2. 声明变量
2.1 声明变量的方式
2.1.1 var 声明变量
var声明的变量,会提前到最近的作用域前头,不加var声明提到全局环境,可以重复声明赋值。
var a = 1;
function add(){
var a = 2;
var b = 3;
return sum = a + b ;
console.log(sum); //5
}
add()
console.log(sum); //5
2.1.2 let 声明变量
let声明不会声明提前,作用域在当前区域,但是不可以重复声明同一名称的变量。
2.1.3 const 声明变量
const声明的时候必须赋值,且不能被修改。