JavaScript高级程序设计读书分享之4章——4.2执行上下文与作用域
JavaScript高级程序设计(第4版)读书分享笔记记录
适用于刚入门前端的同志
执行上下文
变量或函数的上下文决定 了它们可以访问哪些数据,以及它们的行为。
在浏览器中,全局上下文就是我们常说的 window 对象(第 12 章会详细介绍),因此所有通过 var 定义的全局变量和函数都会成为 window 对象的属性和方法。
示例:
var color = "blue";
function changeColor() { let anotherColor = "red"; function swapColors() { let tempColor = anotherColor; anotherColor = color; color = tempColor; // 这里可以访问 color、anotherColor 和 tempColor } // 这里可以访问 color 和 anotherColor,但访问不到 tempColor swapColors();
}
// 这里只能访问 color
changeColor();
以上代码涉及 3 个上下文:
全局上下文、changeColor()的局部上下文和 swapColors()的局部上下文。
- 内部上下文可以通过作用域链访问外部上下文中的一切,但外部上下文无法访问内部上下文中的任何东西。
- 每个上下文都可以到上一级上下文中去搜索变量和函数,但任何上下文都不能到下一级上下文中去搜索
变量声明
使用 var 的函数作用域声明
- 在使用 var 声明变量时,变量会被自动添加到最接近的上下文。
- var 声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前——‘变量提升’
使用 let 的块级作用域声明
- ES6 新增的 let 关键字跟 var 很相似,但它的作用域是块级的,这也是 JavaScript 中的新概念
- 块级作用域由最近的一对包含花括号{}界定
- if 块、while 块、function 块,甚至连单独 的块也是 let 声明变量的作用域
let 与 var 的另一个不同之处是在同一作用域内不能声明两次。重复的 var 声明会被忽略,而重复的 let 声明会抛出 SyntaxError。