如果你对ES5和ES6还分不清楚,可先阅读:JavaScript、ES5和ES6的介绍和区别 - 傅恒 - 博客园
https://www.cnblogs.com/fuheng01/articles/JS.html
ES5作用域
js中能创建作用域的只能是函数
{
let a = 1;
var b = 2;
}
console.log(a); // a is not defined
console.log(b); // 2
如上:var的作用域是所在的函数体;let的作用域则为所在的代码块
在某个函数中使用var声明变量,那个变量就将被视作一个局部变量,只存在于函数中.函数调用结束,其局部变量也随之销毁。
当代码写好的时候,能够根据代码的结构确定变量的作用域,这种情况下的作用域就是词法作用域。js就是此法作用域,不是动态作用域。
作用域链
作用域链就是变量对象组成的一条线。只有当函数执行时会形成作用域链,作用域链的前端始终是当前执行代码所在的执行环境对应的变量对象,往后是下一个(外部)变量对象,直到最外面的执行环境的变量对象。
变量对象中变量的解析查找就是沿着作用域一级一级查找
如果执行环境中的变量没有用var声明,那么在函数执行时(此时才会形成作用链)会沿着作用域一级一级查找变量对象,如果没有找到则会在全局变量对象中声明该变量并初始化。例如:
function test() {
a = 1;
}
test();
console.log(a); // 1
ES6作用域
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。块级作用域就是包含在{ }里面的,ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
具体可参考:https://segmentfault.com/a/1190000011900527