闭包
闭包就是一个能读取另外一个函数内部变量的函数。
构造方法:在一个函数的内部定义另一个函数。内部函数可以引用外部函数内的变量。
PS:在外层函数return里面的那个函数是为了让里面这个函数能够被使用,这个return跟闭包无关。
优点:避免全局变量被污染
缺点:内存消耗大
this
this最终指向的是调用它的对象
普通对象调用this:指向global或window
构造函数调用this:指向当前new出来的实例对象
箭头函数调用this:指向上下文中的this指向的对象
对象调用this:指向当前对象
call/apply/bind调用this:指向它的第一个参数,也就是当前对象
Ajax
Ajax=异步的JS和XML
Ajax可以实现网站的异步更新,是一种能让网页实现部分更新的技术
工作原理:首先是通过XMLHttpRequest对象来向浏览器发送异步请求,然后浏览器就会从服务器端获取数据,最后通过JavaScript来操作DOM,从而实现网页的异步更新
使用步骤:
- 创建XmlHttpRequest对象
const request = new XmlHttpRequest() - 设置请求方式:GET还是POST,true还是false(设置是否为异步请求)
request.open("GET","a/b/c?name=ff",true) - 调用回调函数
request.onreadystatechange=function(){} - 向服务器发送请求
request.send()
手写Ajax:
const request=new XmlHttpRequest()
request.open("GET","a/b/c?name=ff",true)
request.onreadystatechange=function(){
if(request.readyState===4 && request.status===200){
console.log(request.responseText)
}
}
request.send()
Promise
Promise是一种异步编程的解决方案,主要是用于解决JS异步里回调机制所产生的回调地狱的问题。
Promise封装了异步回调机制,让异步回调的可读性更强,且可以链式调用。
Promise的三个状态:resolved成功,pending进行中,rejected失败
常用API:
- Promise.prototype.then():then方法为Promise注册回调函数,且一定要return一个结果或者是一个新的Promise才能实现链式调用。then接受两个回调函数作为参数,一个是Promise执行成功后执行的函数,一个是Promise执行失败后执行的函数。函数形式:function(value){} ,其中value是上一个任务执行的结果。
- Promise.prototype.catch():catch方法用于捕获异常。函数形式function(error){}。一般来说,写then方法时不要写第二个参数(即rejected状态的回调函数),而是在后面用catch捕获错误,原因是这样就可以把前面then的错误也捕获到。由于catch方法返回的还是一个新的Promise对象,所以后面还可以接着then方法继续链式调用。
Promise.then(function(value){},function(error){}) //改写成 ↓ Promise.then(function(value){}).catch(function(error){}) - Promise.race():多个Promise同时进行,race方法返回最先执行完的Promise的结果(不管是执行成功还是失败)
Prmise.race([promise1,promise2]).then(success1,fail1) //只要有一个promise成功就执行success1 - Promise.all():多个Promise同时进行,all方法以数组的形式返回所有Promise的结果。如果有一个Promise执行失败,则返回执行失败的Prmoise的结果。
Prmise.all([promise1,promise2]).then(success1,fail1) //两个promise都成功才执行success1