当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。对于每个执行上下文,都有三个重要属性:
- 变量对象(Variable object,VO)
- 作用域链(Scope chain)
- this
那么作用域链是什么呢?一起来看看。
作用域
作用域,就是变量或者是函数能作用的范围。
1.全局作用域
除了函数中定义的变量之外,都是全局作用域。
var a = 1;
function bar(){
console.log(a);
}
bar();//1
a就是全局变量,在函数里也可以访问a
2.函数作用域
创建函数后在花括号中声明的一些语句或变量只在当前函数中起作用。
var a = 10;
function bar(){
var a = 20;
console.log(a);
}
console.log(a);//10,取的全局作用域中的a
bar();//20,取的局部作用域中的a
3.块级作用域
ES6带来的新特性,在语句块中声明的语句或变量只在当前语句块中起作用。
函数作用域和块级作用域根本没有直接关系,函数作用域在ES5和ES6作用完全一样,变量不论是使用var声明还是使用了let ,const声明在外部都是不可以访问的。
块级作用域指的就是使用 if () { }; while ( ) { } …