本文内容: 一、什么是做用域?执行环境、变量对象; 二、什么是做用域链? 三、扩展:延长做用域链的两条语句with与catchjavascript
做用域链是javascript中常见的一个概念,想要理解做用域链,首先要理解好下面的两个概念:执行环境(常说的做用域)和变量对象。前端
首先在其余语言中所说的做用域,在javascript中也叫执行环境,一般把做用域叫做执行环境,在javascript高级程序设计这本书中也是称为“执行环境”。 那么到底什么是执行环境呢?java
执行环境是javascript中的一个重要概念,它定义了变量或者函数有权访问的数据。执行环境有两种类型:全局执行环境和局部执行环境,其中局部执行环境就是指函数。(也能够说javascript做用域有两种,全局做用域和局部做用域) 全局执行环境是最外围的一个执行环境,如在Web浏览器中,全局执行环境就是window对象,所以全部全局变量和函数都是做为window对象的属性和方法建立的。 另外还有一个与之相关的重要概念,就是变量对象。浏览器
每个执行环境(每个做用域)都有一个与之关联的变量对象,环境定义的全部变量和函数都保存在这个对象中(咱们是没法访问到这个对象的,它的做用是解析器处理数据时会在后台使用它)。函数
做用域链,顾名思义是一条链式结构,而这条链的每个节点应该是做用域。又由于做用域即执行环境,上面说到每一个执行环境都有一个与之关联的变量对象,所以能够说做用域链是这样的一条链: ui
var a = 1
function fn1 () {
var b = 2
fn2()
console.log(a,b) // 1,2 此时只能访问a,b, 访问c会报错
function fn2() {
var c = 3
console.log(a,b,c) // 1, 2, 3,这里a,b,c所有可以访问
}
}
fn1()
console.log(a) // 1 此时只能访问a, 访问b,c会报错
复制代码
上面的代码涉及了三个执行环境:全局环境、fn1()的局部环境和fn2()的局部环境。在全局执行环境中只有一个变量a和函数fn1(),在函数fn1()的局部环境中有一个变量b和函数fn2(),可是在此执行环境中除了b和fn2还能够访问变量a,由于全局环境是它的父执行环境。在fn2()的局部环境中,有一个变量c,除了变量c,这个执行环境中还能够访问全局环境中的变量a和它的直接父执行环境fn1()中的变量b。下面的图能够形象的展现这个做用域链。spa
有两个语句,能够使做用域链的前端增长一个变量对象: catch和with;设计