###异步编程
js引擎是单线程的(浏览器是多进程 多线程的)
进程:是操作系统分配资源(cpu的时间片)的最小单位
线程:是进程内部的最小单元
线程使用的资源是他所属的进程去抢的
进程内部可以有多个线程
这些线程共享资源
多线程开发:
A线程创建的变量,B线程可以读到,B线程也可以修改
锁!!!!
###回调函数:
一般回调函数都是一个匿名函数
我们只想要定义回调函数 不需要调用
最终函数会被js引擎自动调用(带条件)
条件: 时间到了 用户触发了一些行为
同步回调函数
立马执行 只有等同步回调函数执行完毕 后续代码才可以继续执行
arr.map(function(item,index,arr){})
异步回调函数
setTimeout(function(){},time)
js代码只能由js引擎来执行.
js引擎是单线程的 一个时间点只能执行一个任务(解析js代码);js引擎遇到异步代码(异步回调函数)选择通知浏览器开启异步线程
让异步线程持有这个回调 在一定条件达成的情况下 异步线程将异步回调函数 塞到异步队列中 等待js引擎来轮询
只要js引擎空闲下来就会去不断的轮询异步队列!!
###生命周期
作用域的生命周期:
函数定义的时候创建
浏览器关闭的时候销毁
执行上下文的生命周期:
函数调用的时候创建
函数调用结束之后被释放 下一轮垃圾回收机制运行时正式销毁
闭包的生命周期:
闭包有个必要的前提: 函数产生了嵌套,内部函数使用了外部函数的变量 就会产生闭包
闭包在外部函数调用时创建的!!
当内部函数被设置为null时 闭包被释放(游离) 下一轮垃圾回收机制运行时正式销毁
###闭包
闭包有个必要的前提:
函数产生了嵌套,内部函数使用了外部函数的变量 就会产生闭包
当函数可以记住并访问自己的作用域链时就会产生闭包
闭包什么时候被创建
闭包在外部函数调用时创建的!!
闭包什么时候销毁
当内部函数被设置为null时 闭包被释放(游离) 下一轮垃圾回收机制运行时正式销毁
闭包的位置
内部函数的作用域
闭包的作用
延长外部函数变量的生命周期
闭包的缺点
容易产生内存泄漏
前端没有高并发(没有多线程开发)
不用太在意内存泄漏
闭包的应用
this的劫持
模块化
闭包和内部函数是一一对应的关系!!!!!!
###原型
原型分显式原型 隐式原型
显式原型 js中所有的函数具有显式原型
隐式原型 js中所有的对象具有隐式原型
对象的隐式原型 指向其构造函数的显式原型
Fuction的__proto__指向Fuction的prototype
所有的原型对象都是一个{}
所有的原型对象.__proto__ === Object.prototype
Object.prototype.__proto__ === null
所有的原型对象都有一个constructor属性 指向原函数
###原型链
隐式原型链
为什么要有原型链
属性的查找与设置
查找:先在对象的直接属性中找 找到了就返回 找不到就访问原型链 整条原型链都没有 返回undefined
设置:只影响对象的直接属性
怎么用原型链
继承
a instanceof b (a:对象 b:函数)
b的显式原型是否出现在了a的隐式原型链上
###方法的重写
低层的原型对象上的属性 覆盖了 高层原型对象上的属性
###怎么判断一个对象是数组
1.isArray
2.Object.prototype.toString.call(Obj) 如果返回的字符串中包含Array 说明obj是数组
3.a instanceof Array 如果返回true就是数组
###对象的创建方式
1.Object构造
2.字面量
前端在处理业务逻辑时 对类型的依赖性不强(将数据放到页面上进行展示)
后台在处理业务逻辑时 对类型的依赖性很强(后台的数据和数据库中和每一张表进行对应)
3.工厂模式
4.自定义构造函数
5.自定义构造函数+原型链
6.Object.create(obj)
创建处于一个已经被指定隐式原型指向的实例对象
###继承
1.构造函数继承
显式调用父类的函数
2.原型链继承
将子类的显式原型改成一个父类的实例对象
3.组合继承
构造函数继承(属性)+原型链继承(方法)
方法:属性值为函数的属性
###this指向的优先级
构造调用>显式调用>隐式调用>普通调用