节流和防抖的区别
函数节流是指一定时间内js方法只跑一次。比如人的眨眼睛,就是一定时间内眨一次。这是函数节流最形象的解释。
函数节流应用的实际场景,多数在监听页面元素滚动事件的时候会用到。因为滚动事件,是一个高频触发的事件。
函数防抖是指频繁触发的情况下,只有足够的空闲时间,才执行代码一次。比如生活中的坐公交,就是一定时间内,如果有人陆续刷卡上车,司机就不会开车。只有别人没刷卡了,司机才开车。
函数防抖的应用场景,最常见的就是用户注册时候的手机号码验证和邮箱验证了。只有等用户输入完毕后,前端才需要检查格式是否正确,如果不正确,再弹出提示语。
什么是Promise
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。
promise.prototype.then()
then 方法中前一个回调函数的返回值可以传递给下一个回调函数。
Promise.prototype.catch()
catch() 方法返回一个Promise,并且只处理拒绝(rejected )的情况。它的行为与调用Promise.prototype.then(undefined, onRejected)相同。 (事实上, calling obj.catch(onRejected)内部调用obj.then(undefined, onRejected))。这意味着即使返回undefined也要提供onRejected函数。
Promise.prototype.finally()
finally() 方法返回一个Promise。在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在Promise是否成功完成后都需要执行的代码提供了一种方式,避免了同样的语句需要在then()和catch()中各写一次的情况。
Promise.resolve()
Promise.resolve()用于将现有对象转换为Promise对象,从而控制异步流程。
而立即resolve的Promise对象是在本轮“事件循环”(Event loop)的结束时,而不是在下一轮“事件循环”的开始时。
Promise.reject()
Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。
注意,Promise.reject()方法的参数,会原封不动地作为reject的理由,变成后续方法的参数。这一点与Promise.resolve方法不一致。
new的实现原理
如果想要了解new的实现原理,那么就要知道在调用 new 的过程中会发生了什么事情:
- 创建一个空对象
- 执行构造函数,将this指向空对象,并将参数传入
- 将对象的原型指向构造函数的原型
- 对返回值继续进行处理,如果返回是对象,优先使用用户返回的对象
call、apply、bind三者的用法和区别
call、apply、bind都是改变this指向的方法
call
- fn.call
当前实例(函数fn)通过原型链的查找机制,找到
function.prototype上的call方法,function call(){[native code]}
- fn.call()
把找到的call方法执行 当call方法执行的时候,内部处理了一些事情:
1.首先把要操作的函数中的this关键字变为call方法第一个传递的实参
2.把call方法第二个及之后的实参获取到
3.把要操作的函数执行,并且把第二个以后传递进来的实参传递给函数
- call中的细节
- 非严格模式
如果不传参数,或者第一个参数是
null或undefined,this都指向window
- 严格模式
第一个参数是谁,this就指向谁,包括
null和undefined,如果不传参数this就是undefined
-
apply
-
apply:和call基本上一致,唯一区别在于传参方式
apply把需要传递给fn的参数放到一个数组(或者类数组)中传递进去,虽然写的是一个数组,但是也相当于给fn一个个的传递
-
3.bind
-
bind:语法和call一模一样,区别在于立即执行还是等待执行,bind不兼容IE6~8