宏任务、微任务
1、宏任务有:script(整体代码)、setTimeout、setInterval、I/O、页面渲染;
2、微任务有:Promise.then、Object.observe、MutationObserver。
3、执行顺序大致如下:
主线程任务——>宏任务——>微任务——>微任务里的宏任务一……——>直到任务全部完成
JSONP
1、原理:利用<script>;标签没有跨域限制的漏洞,使得网页可以得到从其他来源动态产生的JSON数据(前提是服务器支持)。
2、优点:实现简单,兼容性好。
3、缺点:仅支持get方法,容易受到XSS攻击。
nginx反向代理
1、原理:类似Node中间件服务器,通过nginx代理服务器实现。
2、实现方法:下载安装nginx,修改配置。
EventLoop事件循环
js 是一门单线程的需要,它的异步操作都是通过事件循环来完成的。整个事件循环大体由执行栈、消息队列和微任务队列三个部分组成。
同步代码会直接在执行栈中调用执行。
定时器中的回调会在执行栈被清空且定时达成时推入执行栈中执行。
promise, async异步函数的回调会被推入到微任务队列中,当执行栈被清空且异步操作完成时立即执行。
require/import之间的区别
1、require 是CommonJS语法,import是ES6语法;
2、require只在后端服务器支持,import在高版本浏览器及Node中都可以支持;
3、require引入的是原始导出值的复制,import 则是导出值的引用;
4、require时运行时动态加载,import是静态编译;
5、require 调用时默认不是严格模式,import则默认调用严格模式。
变量的赋值可以分为三个阶段
1、创建变量,在内存中开辟空间
2、初始化变量,将变量初始化为undefined
3、真正赋值
关于let、var和function:
1、let的「创建」过程被提升了,但是初始化没有提升。
2、var的「创建」和「初始化」都被提升了。
3、function的「创建」「初始化]和「赋值」都被提升了。
闭包
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域
闭包的特性
1、函数内再嵌套函数
2、内部函数可以引用外层的参数和变量
3、参数和变量不会被垃圾回收机制回收
JavaScript原型、原型链
1、每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问—个对象的属性时
2、如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样―直找下去,也就是我们平时所说的原型链的概念
3、关系:linstance.constructor.prototype=instance.__proto__
特点
1、JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变
2、当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性,如果没有的就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到Object内建对象
事件代理
1、事件代理(Event Delegation),又称之为事件委托。是 (JavaScript 中常用绑定事件的常用技巧。顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能
2、可以大量节省内存占用,减少事件注册,比如在table上代理所有td的click事件就非常棒
3、可以实现当新增子对象时无需再次对其绑定
Javascript实现继承
1、构造继承
2、原型继承
3、实例继承
4、拷贝继承
事件模型
1、冒泡型事件:当你使用事件冒泡时,子级元素先触发,父级元素后触发
2、捕获型事件:当你使用事件捕获时,父级元素先触发,子级元素后触发
3、DOM事件流:同时支持两种事件模型:捕获型事件和冒泡型事件
4、阻止冒泡:在W3c中,使用stopPropagation()方法;在IE下设置cancelBubble=true
5、阻止捕获:阻止事件的默认行为,例如click-<a>后的跳转。在W3c 中,使用preventDefault ()方法,在IE下设置 window.event.returnValue=false