1.全局变量和局部变量
- 全局变量:全局变量,即函数外部申明的变量类型;此变量在任何地方都可以访问且可以被修改;
- 局部变量:在函数内部申明的变量,只能在定义的函数内部访问,其他地方不能被访问到;
JS中的变量属于松散数据类型,定义的变量可以是任何类型的值,不存在数据类型值的规范;统一只用var关键字来申明;并且可以赋值任何类型(基本数据类型和引用数据类型);
- 引用数据类型:对象保存在堆中,通过定义变量指向对象。
-
基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
-
确定一个值是哪种基本类型可以使用 typeof 操作符,而确定一个值是哪种引用类型可以使用 instanceof 操作符。 所有变量(包括基本类型(Array,Object,RegExp)
2. 执行环境和作用域
执行环境:在JS中,全局是最外层的一个环境,全局执行环境也默认是一个window对象。所有全局变量和函数都是作为 window 对象的属性和方法创建的。所在的环境中执行完毕之后,所有变量和函数定义就会被销毁。(全局执行环境直到应用程序退出——例如关闭网页或浏览器——时才会被销毁)。
作用域链:每个函数都有自己的作用域。当代码在一个环境中执行时,会创建当前变量对象的一个的作用域链。当前执行的代码所处的环境处于作用域链的前端。当前域中的标识符变量可以逐级向下搜索标识符,如果全部都没有,就会报错。全局执行环境的变量对象始终都是作用域链中的最后一个对象。因此,内部环境可以通过作用域链访问所有的外部环境,外部环境不能访问内部环境中的任何变量和函数。函数参数也是函数内部的变量,地位相同。
由此可以看出,访问局部变量比访问全局变量要快,因为不需要从作用域链去查找。
3.内存问题
JS有自动垃圾回收机制。执行环境会自动负责管理代码的内存回收。JS中有两种回收机制:
- 标记清除:当变量进入到执行环境时候,就会给他标记为“进入环境”,当变量离开换机时候,就会给他标记为“离开环境”。当变量离开环境之后,当前执行环境变量不再能访问到变量的时候,垃圾回收机制就会将其视为“垃圾”,然后回收它们占用的内存空间。
- 引用计数:是跟踪记录每个值被引用的次数。如果一个引用类型的值赋值给变量时候,这个值得引用次数就是1,。同一个值又赋值给其他变量的话,就计数+1。如果获得该值的变量又引用了其他的值,则此值得引用次数减1。所以,当次值得引用次数为0时候,说明没有再引用此值了,就可以将其占用的空间回收回来。垃圾回收机制,就会将引用次数为0的值,回收其占用的空间。
在JS中,我们尽量少使用全局变量,如果全局变量不再使用,我们最好将其置为null来释放引用。确保占用最少的内存以便让页面会的更好的性能。而局部变量,会在他们离开执行环境就被销毁。