笔记-js高级程序设计-4.变量、作用域和内存问题

49 阅读2分钟

基本类型和引用类型

  1. 基本类型在内存中占据固定大小的空间,所以被保存在栈内存中。复制时是值传递。
  2. 引用类型被保存在堆内存中。复制时是址传递,所以指向同一片内存。
  3. 参数传递当传递的是基本类型时为值传递,传递引用类型时为址传递。
  4. 基本类型检测可以用 typeof 操作符,引用类型检测用 instanceof 操作符

执行环境和作用域

  1. 全局环境:web 浏览器中,全部环境为 window 对象,因此所有全局变量和函数都是 window 的属性。全局环境直到应用程序退出(关闭网页或浏览器)时才被销毁。
  2. 局部环境:每个函数都有自己的执行环境,当执行流进入一个函数的时候,函数环境被推入一个环境栈中。函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。
  3. 作用域链:作用域的最前端是当前执行代码所在环境,函数环境一开始只存在一个 arguments 对象。全局环境始终是作用域链中最后一个对象。
  4. 标识符解析是沿着作用域链一级一级的搜索标识符的过程。从作用域的前端开始逐级回溯,直到找到标识符。
  5. 延长作用域:try catch 中的 catch 块和 with 语句可以在作用域的前端临时添加一个变量对象,会在代码执行后被移除。
  6. es6 以前没有块级作用域

垃圾收集

  1. 标记清除:给当前不使用的值加上标记。(主流)
  2. 引用计数:跟踪记录所有值被引用的次数。
  3. 解除引用:一旦数据不再有用,最好通过将其值设置为 null 来释放其引用,让值脱离执行环境,以便垃圾收集器下次运行时将其回收。