原型链
1 | //所有对象都有**proto**属性,指向其构造函数的 prototype 对象, |
继承
1 | //原型继承 把父相关属性和方法挂在子实例的prototype上 |
变量提升
全局上下文的变量对象初始化是全局对象
函数上下文的变量对象初始化只包括 Arguments 对象
在进入执行上下文时会给变量对象添加形参、函数声明、变量声明等初始的属性值
在进入执行上下文时,首先会处理函数声明,其次会处理变量声明,如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性
在代码执行阶段,会再次修改变量对象的属性值
js 校验数据类型
bind 的实现
1 | Function.prototype.myBind = function(context){ |
函数柯里化
1 | //就是将调用一个有多个入参的函数改造为调用多个只有一个入参的函数 |
V8 引擎的垃圾回收机制
1、V8 引擎采用分代式垃圾回收机制,分为新生代、老生代、大对象区等。大量新创建的对象都存放在新生代区,该区的垃圾回收较为频繁,新生代分为 from 和 to 空间,from 空间存放刚创建的变量对象
等,垃圾回收时,如果 from 空间的对象没有被引用,则直接回收,如果被引用,则复制到 to 空间。下次垃圾回收时,检查 to 空间的对象如果 to 空间的对象没有被引用,则直接回收,如果被引用,则复制
到 from 空间。如果对象经过一次 Scavenge 算法,且 To 空间的内存占比已经超过 25%,则将对象直接晋升到老生代区。老生代区管理着大量的存活对象,因此采用标记清除算法,早期的引用计数法无法解
决循环引用的问题导致内存溢出已被弃用。将老生代区活动对象标记并移至一端,然后清除剩下的对象。
2、避免内存溢出的方法:
2.1 减少全局变量的定义,因为标记清除法是以根节点也就是全局对象出发标记的
2.2 及时清除定时器、延时器等
2.3 少用闭包
2.4 清除对 dom 的引用
new 操作符的模拟实现
1 | function myNew(){ |