typeof typeof typeof 'nihao'
返回结果是'string'
typeof bull
返回值是'object'
typeof function
返回值'function'
typeof n
检测一个未被声明的变量,返回值是'undefined'
var a = 13;
console.log(a,window.a)// 13 13
let b = 15;
console.log(b,window.b)// 15 undefined
d = 15 //等于window.d
//注:在全局上下文中,使用一个变量,首先看是不是VO中,若是不是则看GO,若是尚未就未定义错误。
复制代码
引用计数相似与标记清除,它也是进行一个标记,不过是这个地址被引用几回就标记为几,当它的引用计数为0时,浏览器在空闲时就会将它回收。ios
例如git
let obj = { name: 1, age: 12}; //此时会建立一个堆内存来存储键值对
obj = null; //将变量obj从新赋值,刚刚建立的堆内存在浏览器空闲后就会进行释放回收
复制代码
私有上下文:通常函数(代码块)中的代码执行完,浏览器会自动把私有上下文出栈释放,可是若是,当前上下文中,某个和它关联的内容(通常是一个堆内存)被当前上下文之外的事物占用了,那么这个私有上下文不能出栈释放,这样私有上下文中的私有变量和值也被保存起来了。web
他是一种机制,函数执行会产生一个私有上下文(做用域),能够保护里面的私有变量不受外界干扰,防止全局变量污染,我i们把函数执行的这种机制叫作闭包。ajax
beforeUpload(file){
let {type, size} = file
if(/(png|git|jpeg|jpg)/i.test(type)){
this.$message('文件格式不正确')
retrun false
}
if(size>200*1024*1024){
this.$message('文件格式不正确')
return false
}
}
handleSuccess(result){
//请求成功后返回数据result
}
复制代码
function fileParse(file,type==='base64'){
return new Promise(resolve=>{
let fileRead = new FileReader();
if(type=='base64'){
fileRead.readAsDataURL(file);
}else{
fileRead.readAsArrayBuffer(file)
}
fileRead.onload = ev=>{
resolve(ev.target.result)
}
})
}
复制代码
import SparkMD5 from 'spark-md5'
async changeFile(file){
if(!file) return
file = file.raw
//利用上面的方法解析文件转为buffer数据
//咱们会把文件切片处理;把一个文件分割成为好几个部分(固定数量/固定大小)
//固定数量
//每个切片有本身的部分数据和本身名字,例如HASH-1.mp四、HASH-2.mp四、HASH-3.mp4...
let buffer = await fileParse(file,'buffer'),
spark = new SparkMD5.ArrayBuffer(),
hash,
suffix;//后缀名
spark.append(buffer)
hash = spark.end()
suffix = /\.([0-9a-zA-Z]+)$/i.exec(file.name)[1]
//建立100个切片
let partList = [],
partsize = file.size / 100,
cur = 0
for(let i = 0; i<100; i++){
let item = {
chunk: file.slice(cur,cur + partsize),
filename: `${hash}_${i}.${suffix}`
}
cur += partsize
partList.push(item)
}
this.partList = partList
this.hash = hash
this.fileUpload()
}
//上传切片
async function fileUpload(){
//根据100个切片创造100个请求集合
let requestList = [];
this.partList.forEach((item,index)=>{
let fn = ()=>{
let formData = new FormData();
formData.append('chunk',item.chunk)
formData.append('filename',item.filename)
return axios.post('url',formData,{headers:{"Content-Type":"multipart/form-data"}}).then(res=>{
result = res.data
if(result.code==0){
this.total += 1; //这个是上传的个数
//传完的切片移除掉
this.partList.splice(index,1)
}
})
}
requestList.push(fn) //100个请求集合
})
//传递:并发(并行)经过ajax.abort()阻止继续上传/串行基于标识(自定义变量控制不继续发送)
let i = 0;
let complete = async ()=>{
let result = await axios.post('url',{params:{hash:this.hash}})
result = result.data
if(result.code ===0){
this.$message('上传成功')
}else{
this.$message('')
}
}
let send =async ()=>{
if(this.abort) return
if(i>=requestList.length){
//都传完了
complete()
return
}
await requestList[i]()
i++
send()
}
send()
}
//暂停继续,断点上传
function handleBtn(){
if(this.btn){
//断点续传
this.btn = false//经过true false显示继续 暂停
this.abort = false
this.fileUpload()
}
//暂停上传
this.btn = true
this.abort = true
}
复制代码
//若是须要下载json格式的文件
function(res.e){
let blob
if(e==='json'){
blob = new Blob ([JSON.stringfy(res.data)])
}else{
blob = new Blob([res.data])
}
let fileName = decodeURI(escape(res.headers['filename']))
if('dowload' in document.createElement('a')){
let a = document.createElement('a')
a.download = fileName
a.display.style = none
a.href = URL.createObjectURL(blob)
document.body.appendChild(a)
a.click()
URL.removeObjectURL(a.href)
document.removeChild(a)
}else{
navigator.msSaveBlob(blob)
}
}
复制代码
let p = new Promise(()=>{})
let p1 = new Promise((resolve,reject)=>{
resolve('ok') // 这是PromiseState就会改成resolved ,PromiseValue的值就成为ok,若是是reject同理
})
复制代码
实例的状态改变能够控制then中两个方法中的一个方法,若是是resolved,触发执行的是第一个回调函数,若是是reject触发的是第二个函数回调。而且会将PromiseValue的值传递给方法chrome
let p = new Promise((resolve,reject)=>{
resolve('ok')
}).then((res)=>{
console.log(res)// 'ok'
},()=>{})
复制代码
当promise的状态由pending改变为resolved或者reject时编程
let p2 = p1.then(res=>{ console.log(111) },rej=>{})
element-ui
若是咱们的onfulfilledCallback和onrejectCallback不传递,则状态会顺延/穿透到下一个同等状态应该执行的函调函数上,内部是实际上是本身补充了一些实现效果的默认函数。json
new Promise ((resolve,reject)=>{
resolve('ok')
}).then(null,null).then((res)=>{
console.log('成功',res),
(reject)=>{
console.log('失败',reject)
}
})
复制代码
catch捕获失败的,原理以下axios
Promise.prototype.catch = function(onrejectedCallback) {
return this.then(null,onrejectedCallback)
}
复制代码
结合顺延和catch,真实项目中写法数组
new Promise((resolve,reject)=>{
reject('no')
}).then(res=>{
console.log('成功',res)
}).catch(rej=>{
console.log('失败',rej)
})
复制代码
all
let a = new Promise((resolve)=>{
resolve('ok')
})
let b = new Promise((resolve,reject)=>{
reject('no')
})
Promise.all([a,b]).then(res=>{
console.log(res,'ok')
}).catch(rej=>{
console.log(rej,'rej')
})
复制代码
race谁先知道状态就返回AA的成功和失败
new Promise((resolve)=>{
console.log('promise1')
resolve()
}).then(()=>{
console.log('then11')
new Promise((resolve)=>{
console.log('promise2')
resolve()
}).then(()=>{
console.log('then21')
}).then(()=>{
console.log('then22')
})
}).then(()=>{
console.log('then12')
})// promise1 then11 promise2 then21 then12 then22
复制代码
async function fn(){
return 10
}
console.log(fn()) //返回promise实例,成功状态,值为10
复制代码
let a = async function fn() {
try {
console.log(b);
} catch (e) {
console.log(e); //捕获错误
}
return 10;
};
console.log(a()); //返回状态是成功的,值是10
复制代码
async function fn(){
await 1 //等价于 await Promise.resolve(1)
await Promise.reject(1)
console.log(1111) // 不会输出1111
}
复制代码
'use strict'
var fn = function(){console.log(this)}
//window(function(x){console.log(this)})(10)
//windowfunction(callback){callback()}
//通常是window,可是能够经过call改变。var x = 3,
obj = {
x: 5,
};
obj.fn = (function () {
this.x *= ++x; //window x = 12
return function (y) {
console.log(this)
this.x *= ++x + y; //obj.x = 95
console.log(x); //x 13
};
})();
var fn = obj.fn;
obj.fn(6);
fn(4); //234
console.log(obj.x, x); //95 234
//首先代码从上到下执行,建立x, obj, obj.fn,自执行函数执行,而后将return这个函数赋值给fn
// obj.fn(6)执行,至关于this是obj,执行的函数是返回值
// fn(4)执行,至关于它的this是window
复制代码