JavaScript高级程序设计-变量,作用域,内存

概述

js的变量和其他语言的变量有很大区别。js变量松散类型的本质,决定了它只是在特定的时间用于保存特定值的一个名字而已。由于不存在定义某个变量时必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变

1基本类型和引用类型的值

基本类型:简单的数据段
引用类型:那些可能由多个值构成的对象
给变量赋值时解析器必须确定值是基本类型还是引用类型
基本类型:按值访问,可以操作保存在变量中的实际的值
引用类型:按引用访问

1.1动态属性

引用类型:可以添加,删除,改变属性和方法
基本类型:不可以

1.2复制变量值

基本类型:复制一个新的值
引用类型:复制的是引用,指向堆中存在的同一个对象

1.3传递参数

所有的函数的参数都是按值传递的。 待办:疑问?红皮书中的例子有点模糊

1.4检测类型

typeof 变量名 分辨出 string number boolean undefined object
变量名 instanceof constructor 返回true或false 用来判断是哪一种引用类型

2执行环境和作用域

执行环境(环境)定义了变量或函数有权访问的其他数据。
每个执行环境对应一个变量对象,用于保存环境中定义的所有变量和函数。
环境在执行时创建变量对象的一个作用域链。
作用域链:当前变量对象(当前执行代码所在环境的变量)-》外层变量对象(来自于外层环境)-》在外层直到全局环境的变量对象

2.1延长作用域链

try-catch语句的catch块
with语句

2.2没有块级作用域(es6有了)

声明变量:var声明的变量会自动添加到最近的环境中
查询标识符:沿作用域链逐级向上,找到就停止

3垃圾收集

垃圾收集机制:找出不再使用的变量,然后释放内存,按固定时间间隔或周期进行执行

3.1标记清除

3.2引用计数

缺点:如果两个对象互相引用,将永远无法回收

3.3性能问题

ie非原生对象(dom)使用引用计数

3.4管理内存

手动断开不用对象的引用

猜你喜欢

转载自blog.csdn.net/qq_45429539/article/details/112388956
今日推荐