javascript做用域篇1、什么是javascript做用域链

本文内容:javascript

  1. 什么是做用域?执行环境、变量对象;
  2. 什么是做用域链?
  3. 扩展:延长做用域链的两条语句with与catch

做用域链是javascript中常见的一个概念,想要理解做用域链,首先要理解好下面的两个概念:执行环境(常说的做用域)和变量对象。前端

做用域 == 执行环境
首先在其余语言中所说的做用域,在javascript中也叫执行环境,一般把做用域叫做执行环境,在javascript高级程序设计这本书中也是称为“执行环境”。
***那么到底什么是执行环境呢?***java

执行环境
**执行环境**是javascript中的一个重要概念,**它定义了变量或者函数有权访问的数据。执行环境有两种类型:全局执行环境和局部执行环境,其中局部执行环境就是指函数。(也能够说javascript做用域有两种,全局做用域和局部做用域)**
全局执行环境是最外围的一个执行环境,如在Web浏览器中,全局执行环境就是window对象,所以全部全局变量和函数都是做为window对象的属性和方法建立的。
另外还有一个与之相关的重要概念,就是**变量对象**。
变量对象
每个执行环境(每个做用域)都有一个与之关联的**变量对象**,环境定义的全部变量和函数都保存在这个对象中(咱们是没法访问到这个对象的,它的做用是解析器处理数据时会在后台使用它)。浏览器

做用域链
做用域链,顾名思义是一条链式结构,而这条链的每个节点应该是做用域。又由于做用域即执行环境,上面说到每一个执行环境都有一个与之关联的变量对象,所以能够说做用域链是这样的一条链:函数


做用域链中的每个节点都是变量对象,变量对象上面保存着当前执行环境(做用域)中定义的变量和函数。做用域链的起点是当前执行的代码所在的执行环境对应的变量对象,下一个节点的变量对象则是来自包含环境,即上一个节点所在的执行环境的外部环境,再下一个节点是下一个外部环境,这样一层层延续直至到全局环境:全局环境的变量对象永远是做用域链的终点。
*知道了做用域链是什么,又有了另外一个疑问做用域链这个东西是用来干什么的呢?*
做用域链的提出是为了在任何执行环境中访问变量或函数提供一个次序规则。通俗的说,你想访问一个变量,那么这个变量去哪里拿到呢,当前执行环境有,则取当前执行环境下的,这个无可厚非,当前环境没有定义的,则按照这个做用域链一级一级的搜索做用域链,若最后直到在全局环境中都尚未找到,则会报错,视为该变量没有定义。spa

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。下面的图能够形象的展现这个做用域链。设计


内部环境能够经过做用域链访问全部的外部环境。但外部环境不能访问内部环境中的任何变量和函数。每一个环境均可以向上搜索做用域链以查询变量和函数名,但任何环境不能向下搜索做用域链。对象

扩展
有两个语句,可使做用域链的前端增长一个变量对象:
catch和with;blog

相关文章
相关标签/搜索