zoukankan      html  css  js  c++  java
  • js(2)关于作用域和作用域链

    一:什么是作用域:

    执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为,在JavaScript中,全局执行环境被认为是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的,

    关于在全局变量和局部变量,作用域的问题,只要记住一句话:

    内部函数可以通过作用域链访问到所有的外部环境,但外部环境不能访问到内部环境中的任何变量和函数,每个环境可以向上搜索作用域链,以查询变量和函数名,任何环境都不能通过向下搜索作用域链进入另一个执行环境

    或者说:子环境可以访问父环境,父环境不能访问到子环境

    二:关于作用域链,

    作用域链的用途:是保证对执行环境有权访问的所有变量和函数的有序访问,

    作用域链的前端,始终都是当前执行的代码所在环境的变量对象,作用域链中的下一个变量对象来自包含环境,而下一个变量对象则来自于下一个包含环境,这样,一直;延续到全局执行环境

    标识符解析是沿着作用域链一级一级的搜索标识符的过程,搜索过程是从作用域的前端开始,然后逐级向后回溯,直到找到标识符为止

    查询标识符的过程,从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符

    代码如下:

     var  color="blue";
    function  getColor(){
      return color()
    }
    alert(getColor()): //“blue”

    上面这段代码进行搜索标识符的过程:

    首先明确一点:进行搜索标识符的过程是沿着作用域链进行的,

    上面代码的运行过程:首先,搜索getColor()的变量对象,查找其中是否含有名为color的变量对象,如果没有找到,继续向作用域链的下一级(全局环境的变量对象)进行搜索,如果搜索到定义这个变量的变量对象,搜索过程结束

    注意:如果我们通过作用域链找到的局部环境中存在着同名的标识符,就不会使用父环境中的标识符,代码如下:

    var  color="blue";
    function  getColor(){
              var  color="red";
              return color;        
    }
    alert(getColor());  // "red"
    

     通过沿着作用域链解析的过程,在局部环境中找到了color的值,因此就不会继续向上进行搜索了,搜索立即停止 

      

  • 相关阅读:
    常见试题
    Makefile学习笔记
    安装java
    IntelliJ IDEA for mac 快捷键
    JPA--Caused by: javax.persistence.PersistenceException: [PersistenceUnit: mysqlJPA] Unable to configure EntityManagerFactory
    log4j 配置
    Numbers
    mac 命令
    Intellij IDEA for mac 快捷键
    vim命令
  • 原文地址:https://www.cnblogs.com/qianduangaoshou/p/6832815.html
Copyright © 2011-2022 走看看