javascript:变量、作用于和内存问题
一:理解基本类型和引用类型的值
javascript变量有两种不同的数据类型值:基本数据类型和引用数据类型。基本数据类型有undefined、null、boolean、number、string。引用类型是保存在内存中的对象,javascript规定不能直接操作内存中的对象,在操作对象时,其实是操作的对象的引用。在将一个值赋给变量时,需要确定值的类型,对不同类型的变量执行的操作是不同的,引用类型值可以进行属性和方法的创建和删除,基本数据类型就不可以。
- 复制变量
对于基本数据类型,复制变量时,重新开辟一个内存,复变变量。而引用类型,只是复制的对象的引用。
2.传递参数
所有函数的值都是按值传递。
3.检测类型
对于基本数据类型,使用typeof检测。对于引用类型使用instanceof , 基本语法为 result = variable instanceof constructor,所有引用类型都是Object对象的实例。
二:理解执行环境
执行环境是javascript最为重要的一个概念,执行环境定义了变量和函数有权访问的其他数据,决定了它们各自的行为。与每个执行环境相关的都有一个变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境始终是window对象,所有全局的变量和对象都保存在window对象中。每个函数都有自己的执行环境,当执行一个函数时,函数的环境会被推入环境栈中,函数执行完后,环境从环境栈中弹出,控制权交给上级环境。当代码在一个环境中执行时,会创建变量对象的一个作用域链,作用域链的作用是保证对环境中的有权访问的变量和函数的有序访问。作用域的前端始终是当前代码的执行环境,下一级则是包含当前环境的外部环境,以此类推,最后一个始终是全局执行环境。对变量和函数的解析则是从作用域的前端向后端一级一级的访问搜索。
内部环境可以通过作用域链访问所有外部环境,而外部环境则不能访问内部环境的任何变量和函数。
1.延长作用域链
有些语句可以在作用域的前端临时添加一个变量,该变量在代码执行完后自动删除。有两个语句可以实现延长作用域:try-catch 和 with语句。
2. 没有块级作用域
在其他语言中,花括号里的代码有自己的块级作用域,但javascript中没有块级作用域,花括号中定义的变量和函数会被添加到当前的执行环境中,所有在花括号外仍可以访问到花括号里面定义的变量。
三:理解垃圾收集
javascript具有自动垃圾收集机制,找到那些不再被使用的变量,按照固定的时间间隔,周期性的进行内存的回收。确保javascript占用较少的内存来优化性能。当数据不再有用时,将其值置为null,释放其引用,让其脱离执行环境,以便被垃圾收集机制回收内存,这一做法适用于大多数的全局变量,局部变量会在局部环境执行完后自动回收。