作用域链
- 内容
- 多个上下级关系的作用域形成的链,它的方向是从下向上的(从内到外)
- 查找变量时就是沿着作用域链查找的
- 作用域是静态的,不会随着调用改变上下文
- 查找变量的规则
- 当前作用域的执行上下文中查找对应的属性,如果有直接返回,否则下一步
- 在上一级的作用域的执行上下文中查找对应的属性,如果有直接返回,否则下一步
- 再次执行上一步操作,直到全局作用域,如果还找不到就抛出找不到异常
闭包
- 如何产生
- 当一个镶套的内部函数引用了镶套的外部函数的变量
时,就产生了闭包
- 执行函数定义就会产生闭包,不需要调用
- 何为闭包
- 产生闭包的条件
- 函数镶套
- 内部函数引用了外部函数的数据(变量/函数)
- 常见闭包
- 将函数作为另一个函数的返回值
- 将函数作为实参传递给另一个函数调用
- 闭包的作用
- 使用函数内部的变量在函数执行完毕后,仍然存活在内存中(延长了局部变量的生命周期)
- 让函数外部可以操作(读写)到函数内部的数据(变量/函数)
- 闭包的生命周期
- 在镶套内部函数定义执行完时就产生了
- 在镶套的内部函数成为垃圾对象时死亡
- 闭包缺点
- 函数执行完后局部变量没有释放,占用内存时间会变长
- 容易造成内存泄漏
内存溢出 和 内存泄漏
- 内存溢出
- 一种程序运行出现的错误
- 当程序运行需要的内存超过了剩余的内存,抛出内存溢出的错误
- 内存泄漏
- 占用的内存没有及时释放
- 内存泄露积累多了就容易导致内存溢出
- 常见内存泄漏
继承模式
- 原型链继承
- 定义父类型构造函数
- 给父类型的原型添加方法
- 定义子类型的构造函数
- 创建父类型的对象赋值给子类型的原型
- 将子类型原型的构造属性设置为子类型
- 给子类型原型添加方法
- 创建子类型的对象:可以调用父类型的方法
- 原型链继承关键
function Father(){
}
function Son(){
}
//继承
Son.prototype=new Father()
//让子类型的constructor指向Son
Son.prototype.constructor=Son
- 借用构造函数继承
- 定义父类型构造函数
- 定义子类型构造函数
- 在子类型构造函数中调用父类型函数
- 借用构造函数继承关键
- 在子类型构造函数中,用call()调用父类型构造函数
function Father(a){}
function Son(){
Father.call(this,a)
}
- 组合继承
- 利用原型链实现对父类型对象的方法继承
- 利用call()借用父类型构造函数初始化相同属性
进程与线程
- 进程
- 线程
- 进程内的一个独立执行单元
- 是 程序执行的一个完整流程
- 是CPU的最小调度单元
浏览器内核
- Chorm Safari:webkit
- firefox:Gecko
- IE:Trident
定时器