js程序如何运行
js程序由浏览器的js解释器编译后运行. // 经历两个步骤: 编译 ,运行;
编译阶段有两步: 词法语法分析 , 代码生成.
词法语法分析阶段就创建了作用域,限定了函数和变量的使用范围.
打开页面->加载js文件->解释器创造全局对象->编译:词法句法分析,发现声明语句,检查变量是否已存在,有则忽视该语句,无则创建变量并分配空间存储 ,…->编译结束,生成代码->执行
由于js是在用户打开页面后, 浏览器即时进行的编译, 所以要求编译速度很快, js解释器对js的编译的速度做了很多的优化,在使用了with后,由于它有新的临时上下文,在这个上下文中,编译没有优化,不利于编译速度的提升,所以不推荐使用with.
作用域和作用域链
作用域: 是js在编译阶段创建的,作用是 保存函数和变量并且限定其使用范围 ;
作用域链: 编译完成之后, 代码运行阶段出现的 .作用是连接作用域 并且 按照这个作用域链依次访问变量和函数.
使用变量时,先在当前作用域查找,找不到则顺着作用域链到上层作用域找.
作用域分类
包括: 全局作用域 函数作用域 块级作用域 临时作用域
① 全局作用域: 浏览器:window ,node : global
② 函数作用域: 函数调用结束则占用的内存被清理; (因为每次调用函数都会: 编译 ->执行->清理)
在es6前只有函数作用域,没有块级作用域 , 如 : 在循环结束之后我们依然能够访问到循环体内的变量(var声明的)
③ 块级作用域: ( function(){ var } )() ; es6的let const ;
④ 临时作用域: try catch 和 with
对with语句来说,会向作用域链前端添加指定的对象;
对catch语句而言,则会创建一个新的变量对象,这个变量对象会包含要抛出的错误对象的声明。
垃圾回收机制:
① 作用: js解释器为了保持自己内存的合理使用,每隔一段时期执行垃圾回收机制,清理没有引用关系的函数和变量
② js会自己对垃圾进行回收,如 : 函数调用结束则清理它使用的内存空间;
③ 如何手动执行垃圾回收?
垃圾回收机制不是函数执行结束立即执行的,而是每间隔一段时间执行一次,只是间隔时间非常短, 大部分浏览器的垃圾回收机制是将没有引用关系的函数和变量清理掉,所以,只需要手动告诉js解释器这个东西已经没用了就行.如:
obj=null ; //下次垃圾回收运行就会清理obj占用的内存
变量声明
- 声明提前
-
针对变量的声明提前 :
编译时,发现了声明语句并且在最近作用域变量不存在,则在当前作用域创建变量,为它分配空间,这时代码还没执行,所以我们说声明提前了.(变量没有赋值) -
针对声明式函数的声明提前:
与变量类似,只是它不但为函数分配了存储空间,还为该函数创建了新作用域,(函数有值,即函数体中的操作)变量名和函数名重名了怎么办? 函数覆盖变量; //作用域可以嵌套但不可覆盖
-