作用域
一、执行环境
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、通过局部函数调用,来用传参实现