作用域

一、执行环境 

  1、执行环境:定义了变量或函数有权访问的其他数据,决定了他们各自的行为

  2、执行环境的类型:全局执行环境   —> script

             局部执行环境   —> 函数

  3、每一个函数都有自己的执行环境,也就是私有作用域

  4、每一个执行环境都有一个变量对象,里面保存的是环境中定义的所有的变量和函数

  5、作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。沿着作用域链一级一级地搜索标识符的过程,如找不到标识符,通常会导致错误发生。局部环境可以通过作用域访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数,全局执行环境的变量对象始终都是作用域链中的最后一个对象。

  6、全局执行环境直到应用程序退出时才会被销毁

  7、javaScript是没有块级作用域的

  8、在局部环境定义一个变量,如果没有使用var声明,该变量会自动被添加到全局环境

 

二、作用域的作用:

  1、帮助你排查问题;

  2、帮助你了解整个代码执行的过程;

  3、帮助你理解JS解析机制是什么样的;

  4、变量的执行环境有助于确定应该何时解放内存;

 

三、浏览器解析过程:

        浏览器中有一个JS解析器:

        1)JS的预解析:(存到预解析的仓库)

            在预解析的过程中,遇到重名:只留一个;

            变量和函数重名了,就只能留函数;

            所有的函数,在正式运行代码之前,都是整个函数块;

            所有的变量在正式运行代码之前都提前赋了一个值,未定义 ;

        2)逐行解读代码

        表达式:= + - * / % ++ -- ! Number() 参数...... (所有能够改变一些值的东西都叫做表达式)

        表达式 是可以修改预解析的值  (也就是可以修改预解析仓库里面的内容)

        在遇到函数这个局部作用域的时候,只要函数调用了,就会对函数进行 :1)预解析

                                                                                     2)逐行解读代码

        当要定义一个全局变量,或者是全局函数的话,要考虑到浏览器兼容问题,因此不要随便在if语句中定义变量和函数(火狐就不能对if语句中定义的全局变量进行解析 (if for等语句不是作用域,只要script\函数\json是全局作用域)

        想要获取函数内的值:  

        1、通过全局变量找到函数内的值

        2、通过局部函数调用,来用传参实现

  

 

posted @ 2015-12-14 16:36  EffieDuo  阅读(124)  评论(0编辑  收藏  举报