书上的示例代码可以通过 在线网站代码调试工具 JS Bin 调试。
作用域
作用域链
每个变量或函数通过执行环境 (execution context) 定义了其有权访问的其他数据,决定了他们各自的行为;
全局执行环境是最顶层的执行环境,根据宿主环境的不同,表示全局执行环境的对象也不同:在浏览器中为 window 或 self 对象,在 Node.js 中为 global;
每个执行环境都有一个与之相关联的变量对象 (variable object) ,存储了改环境中定义的所有变量和函数;
作用域(scope chain) 存储了与当前执行环境相关的所有变量对象,第一个为当前执行环境关联的变量对象,然后是包含环境的变量对象,直至全局执行环境的变量对象,即全局执行环境;
在代码中查找变量的值称为变量解析(variable name resolution),查找顺序是沿作用域链一级一级向外搜索;
全局作用域
函数作用域
块级作用域
函数声明
ES5 规定函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明,但浏览器为兼容旧代码,仍允许在块级作用域中声明;
ES6 明确允许函数在块级作用域声明,但应尽量使用函数表达式形式,如下:
let f = function () {
return a;
};
let 相比较 var 的不同点
只在它所在的代码块有效;
只能先声明后使用,不存在变量提升;
在其声明所在的代码块,不受外部影响,形成暂时性死区;
不能重复声明;