javascript

来源:互联网 发布:印刷设计排版软件 编辑:程序博客网 时间:2024/06/03 14:59

1 关于js数据的内存

  1. 我们的代码运行在机器上,通过处理器来运行,但程序的变量存储在内存中。处理器操作内存来处理数据。
  2. js中有两种类型的数据
    • 值类型数据:独立存在互不影响。赋值等于是克隆了一份值类型数据的副本,然后放在内存中。
    • 引用类型数据:数据存放在内存中,赋值时,是将数据在内存中的地址赋值给变量,使变量保持对数据的引用。就像C中的指针。js中的函数也是对象,也就是引用类型。
  3. v8引擎的运行环境中存在自动垃圾回收机制,若数据没有变量引用,则会被自动回收。
  4. v8引擎会根据内存使用情况逐渐申请内存,64位设备最大支持1.4G内存,32位最大支持0.7G内存。

2 优化

根据上面提到的js数据的内存知识及js语言的特点,来提供内存优化方案。

2.1 善用函数

  1. js中创建作用域的有
    • 函数
    • with (严格模式下禁用)
    • 全局作用域
  2. 由于全局作用域内变量无法销毁,除非关闭浏览器,而with在严格模式下禁用,所以只能从函数身上下手来优化。
  3. 使用函数有以下好处:
    • 可将部分实现抽象,逻辑清晰。
    • 避免变量污染,因为函数在执行后若局部变量没有被保持引用则会被销毁。
    • 匿名函数一般不会被赋值给变量,也就是没有被引用,执行后匿名函数被销毁,不占用内存。
    • 多利用自执行函数,若无闭包,则不论是匿名函数还是内部作用域都将被销毁。
  4. 善用回调函数,回调函数是匿名函数,执行后被销毁,且可解决异步的问题。

2.2 闭包

  我们可以通过闭包来保持对局部变量的引用,这可以解决一些问题。但由于局部变量一直被引用,所以无法被垃圾回收机制自动回收,所以使用闭包是要慎重。
  若无法避免使用闭包,局部变量是值类型,应该使用自执行函数将局部变量作为实参穿进来,避免因闭包引用局部变量导致一些问题。

2.3 避免在全局作用域下创建对象。

  这个不用多说,因为全局作用域只有在浏览器关闭或退出运行环境时才会销毁,所以在全局作用域内定义的对象会一直被引用,直至程序退出。
  另外在全局作用域下定义变量也容易造成污染。

2.4 手动优化

可以将不再使用的变量赋值为null,解除对数据的引用。js垃圾回收机制会自动回收他们。

0 0
原创粉丝点击