-
callback() A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 概念: 是一个函数,作为另外一个函数的参数,在它的父函数完成后被执行。
如果当有很多地方需要调用同一个函数,并且这一函数根据不同的需要,作不同的处理,这个时候用回调函数。可以减少代码的冗余。
function A(callback){
callback()
console.log('我是主函数')
}
function B(){
console.log('我是回调函数')
}
A(B)
// 输出结果为:
我是主函数
我是回调函数
从以上代码可以看出,我们先执行的回调函数callback(),但是输出的时候却是后输出回调函数里面的内容,由此可以证实上面的说法,要等到主函数里面的事情干完再回头去执行回调函数。
开发中的使用----文件的下载
<script>
downloadFile(item){
this.getBlob(item.fileUrl, (blob)=> {
this.saveAs(blob, item.fileName)
})
}
getBlob(url, cb){
let xhr = new XMLHttpRequest()
xhr.open('GET', url, true)
xhr.responseType = 'blob'
xhr.onload = function(){
if(xhr.status === 200){
return cb(xhr.response)
}
}
xhr.send()
}
saveAs(blob, filename){
if(window.navigator.msSaveOrOpenBlob){
navigator.msSaveBlob(blob, filename);
} else {
// 创建隐藏的可下载链接
let link = document.creantElement('a')
let body = document.querySelector('body')
// 将自负内容转为blob地址(映射为blob地址)
link.href = window.URL.createObjectURL(blob)
link.download = filename
link.style.display = 'none'
body.appendChild(link)
// 移除
window.URL.revokeObjectURL(link.href)
}
}
</script>
点击按钮进行下载,先获取文件的blob,再进行下载。
浏览器内部为每个通过 URL.createObjectURL 生成的 URL 存储了一个 URL → Blob 映射
虽然存储了 URL → Blob 的映射,但 Blob 本身仍驻留在内存中,浏览器无法释放它。映射在文档卸载时自动清除,因此 Blob 对象随后被释放。但是,如果应用程序寿命很长,那不会很快发生。因此,如果我们创建一个 Blob URL,即使不再需要该 Blob,它也会存在内存中。
URL.revokeObjectURL(url) 方法,从内部映射中删除引用,从而允许删除 Blob(如果没有其他引用)
href和download是我们下载文件所需要的两个属性:
- href:是指这个超链接指向的url地址;
- download:该属性是HTML5新增的属性,此属性是让我们的浏览器下载URL而不是跳转到URL所指向的内容,所以若我们需要下载文件到本地,需要设置这个属性值。