Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

垃圾回收、严格模式、标准与混杂模式 #14

Open
Lmagic16 opened this issue Oct 12, 2017 · 0 comments
Open

垃圾回收、严格模式、标准与混杂模式 #14

Lmagic16 opened this issue Oct 12, 2017 · 0 comments
Projects

Comments

@Lmagic16
Copy link
Owner

垃圾回收

原理:找出不再使用的变量,然后释放其占用的内存(垃圾收集器周期性地执行)
垃圾回收
方法:

  1. 标记清除:目前主流的垃圾收集算法,将当前不使用的值加上标记,然后进行内存回收。(通过变量在执行环境中的生存周期)
  2. 引用计数:记录所有值被引用的次数,当引用次数为0时,进行内存回收。存在的问题:循环引用会导致内存泄露。所以最好手动解除引用。

说明:

  1. 在标记清除时,如何确定变量不再被使用?
    JS中分为全局执行环境和函数的执行环境,代码运行时,会先将全局执行环境压入栈中,然后当执行流进入函数时,会创建函数的执行环境和相应的作用域链。
    每个函数都有自己的执行环境,对应着相应的作用域链。对变量的查找和赋值都沿着自己的作用域链向上查找。
    创建函数时,会创建一个预先包含全局变量对象的作用域链;当执行函数时,会创建本地活动对象(包括arguments和局部变量),并将其推入作用域链前端。当执行函数时,对变量的查找会沿着作用域链向上搜索,直到作用域链的最顶端—全局变量对象。当函数执行完毕后,本地活动对象会在内存中销毁。而闭包中,当外层函数执行完毕后,外层函数的作用域链被销毁,但被闭包函数引用的活动对象还存在内存中。
    不确定:任何函数(包括闭包函数)在执行完毕后,只能销毁本地活动对象,所以为了销毁闭包引用的活动对象,需要销毁闭包函数,即解除引用null。
  2. 如何引用计数?
    将引用类型值赋给已声明的变量,引用计数加1,若该变量的值变为了其他,则引用计数值减1。当引用计数为0时,进行内存回收。

自我理解代码执行过程:将全局执行环境推入执行栈中,将所有var 变量和函数声明提升到其作用域的顶部,创建函数时,会创建一个预先包含全局变量对象的作用域链;然后从第一行代码开始顺序执行,所有函数都会当函数执行时,则将函数的执行环境推入栈中,并形成其作用域链,函数在声明时会形成一个包含全局对象的作用域链,当函数执行时,会将当前活动对象加入到作用域链中,对变量的查找都是沿着作用链进行查找的。

性能问题:垃圾收集器的执行间隔:IE6根据内存分配量运行,当内存量大时,一般整个程序所需要的内存量就很大,这样会造成垃圾收集器的频繁执行。IE7重写了之后采用的规则:触发垃圾收集的临界值动态变化。初始触发垃圾收集的临界值与IE6相同,若回收的内存分配量低于15%,则临界值加倍;若回收的内存分配量大于85%,则临界值保持不变。

google V8引擎

V8内存回收
V8优化技术及注意事项

严格模式 'use strict';

MDN文档
可以应用于整个脚本,或者单个函数

  1. 使用未声明的变量,会抛出ReferenceError;非严格模式下会新创建一个全局变量。

严格模式1

  1. 任何在正常模式下引起静默失败的赋值操作 (给不可写属性赋值, 给只读属性赋值, 给不可扩展对象的新属性赋值) 都会抛出异常.
  2. 在严格模式下, 试图删除不可删除的属性时会抛出异常(之前这种操作不会产生任何效果)
    严格模式2
  3. 在函数内使用严格模式,若该函数单独调用,则函数内的this不能默认绑定全局对象,this会返回undefined。
  4. with在严格模式下会被禁止,eval的功能也会受影响。
  5. 严格模式要求函数的参数名唯一,函数有重名的参数将报错,而在非严格模式中,后面的同名参数将覆盖前面的。
  6. 严格模式禁止八进制数字语法
    函数的参数不能有同名属性,否则报错
    不能使用with语句
    不能对只读属性赋值,否则报错
    不能使用前缀0表示八进制数,否则报错
    不能删除不可删除的属性,否则报错
    不能删除变量delete prop,会报错,只能删除属性delete global[prop]
    eval不会在它的外层作用域引入变量
    eval和arguments不能被重新赋值
    arguments不会自动反映函数参数的变化
    不能使用arguments.callee
    不能使用arguments.caller
    禁止this指向全局对象
    不能使用fn.caller和fn.arguments获取函数调用的堆栈
    增加了保留字(比如protected、static和interface)

标准与混杂模式

W3school
HTML5中是<!DOCTYPE html>
如果在文档开始处没有文档类型声明,则默认 混杂模式。
混杂模式:不可取,宽松的向后兼容的方式显示。
标准模式:浏览器按 W3C 标准解析执行代码。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
前端
Awaiting triage
Development

No branches or pull requests

1 participant