变量,作用域和内存问题
变量
检测变量种类使用typeof(),检测对象种类用instanceof()
基本类型值
基本类型包括Null,Undefined,Number,Boolean,String,保存在栈内存中/
基本类型值是按值访问的,可以操作保存变量中实际的值
动态属性
不同于引用类型,不能给基本类型的值添加属性
复制变量值
复制变量值时,复制后的两个变量可以进行任何操作而不互相影响
传递参数
在ECMAScript中,所有的函数的参数都是按值传递的
|
|
在函数内部为count增加了10,但是函数外部的count依然是20,并没有受到影响
引用类型值
引用类型包括Object,保存在堆内存中.
引用类型值是按引用访问的,因为不能直接访问对象的内存空间
当复制保存对象的某个变量时,操作的是对象的引用,但为对象添加属性时,则操作的是实际的对象
动态属性
能给基本类型的值添加属性
复制变量值
复制变量值时,复制后的两个变量将引用同一个对象,操作会互相影响
传递参数
在ECMAScript中,所有的函数的参数都是按值传递的
|
|
在函数内部为obj的属性重设置为”Gnomeek”,但没影响到外部输出的结果,依然是”Nick”
执行环境及作用域
执行环境
|
|
每一个环境都可以向上搜索作用链域,而永远不能向下搜索
例如全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;而局部环境不仅可以访问函数作用域中的变量,而且有权访问其父环境,乃至全局环境。
没有块级作用域
声明变量
使用var声明变量时,会自动添加到最接近的环境中,如果没使用var来声明,则会自动添加到全局环境中。
查询标识符
整个搜索过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符;查询到就立即停止,不会继续查询
局部环境中的变量:
|
|
全局环境中的变量:
|
|
不存在的变量:
|
|