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
複製代碼