1.js作用域
js中的變量若在當(dāng)前作用域中沒有,會(huì)向父級尋找,直到最頂層。
2.塊級作用域
js ES5沒有塊級作用域。如果要形成,可以通過()()自執(zhí)行函數(shù)實(shí)現(xiàn)函數(shù)中的作用域?yàn)閴K級作用域;ES6中每一個(gè){}都是一個(gè)塊級作用域。
3.null和undifined的區(qū)別
null是變量被定義但無值,屬于空指針。undefined為從未聲明·。
4.講講閉包理解
指的是一個(gè)函數(shù)可以訪問另一個(gè)函數(shù)作用域中的變量,外層變量不會(huì)被垃圾回收機(jī)制回收。優(yōu)點(diǎn)是:避免全局變量污染。缺點(diǎn)是:榮故意造成內(nèi)存泄漏。
5.為什么閉包會(huì)造成內(nèi)存泄漏
閉包內(nèi)部的匿名函數(shù)在調(diào)用后把外層的變量也包含在自己的作用域內(nèi)了。此變量屬于一直引用中,所以垃圾回收機(jī)制不會(huì)將他回收,導(dǎo)致會(huì)比其他function占用更多內(nèi)存
6.如何解決閉包導(dǎo)致的內(nèi)存泄漏
調(diào)用時(shí)先用變量保存閉包函數(shù),在執(zhí)行完成后為此變量賦值為null,清除指針即可是垃圾回收機(jī)制正?;厥铡?.可以借助()()自執(zhí)行函數(shù),在閉包內(nèi)都不使用return function而是自執(zhí)行函數(shù)取代,因?yàn)樽詧?zhí)行函數(shù)是私有塊級作用域,即可在執(zhí)行結(jié)束后將引用對象銷毀。
7.其他場景的內(nèi)存泄漏及解決方案:
setTimeout及setInterval未在使用后清理,或循環(huán)多個(gè)定時(shí)任務(wù),clear時(shí)有缺漏。
解決方案:每個(gè)定時(shí)器應(yīng)使用變量保存,且在使用后clearTimeOut/clearInterval。
addEventerListener、jquery的on、vue的$on等引用dom后需要做解綁處理
? ? ? ? ? ? ? ? ? ? addEventerListener使用removeEventerlistener解綁
? ? ? ? ? ? ? ? ? ?Jquery.on使用.off解綁
? ? ? ? ? ? ? ? ? ? ?vue的$on使用$off解綁
Vue、react框架需要在生命周期的銷毀周期中執(zhí)行解綁操作,以及定時(shí)器清除。
實(shí)現(xiàn)instaceof:判斷實(shí)例的__proto__和類的prototype是否三等,并且返回結(jié)果。
script異步加載:defer、async、動(dòng)態(tài)創(chuàng)建dom(原生)
? ? ? ? ? ? ? ? defer是script腳本下載好,在dom加載完成后順序加載
? ? ? ? ? ? ? ? ?async是script腳本異步下載完成后自動(dòng)加載
跨域問題:
? ? ? ? ? ? ? ? ? ? ?React、vue中使用proxy設(shè)置域名即可
? ? ? ? ? ? ? ? ? ? ?ajax使用JSONP
事件循環(huán):js是單線程的。會(huì)優(yōu)先執(zhí)行宏任務(wù),執(zhí)行完全部宏任務(wù)后檢測是否有微任務(wù),
有的話將微任務(wù)一起執(zhí)行
微任務(wù)包括什么?
setTimeout、.then等
js消息隊(duì)列:主線程會(huì)將執(zhí)行過程中遇到的異步請求發(fā)送給這個(gè)消息隊(duì)列,
等到主線程空閑時(shí)再來執(zhí)行消息隊(duì)列中的任務(wù)。
數(shù)組借用filter來遍歷元素并按照規(guī)則篩選,返回新的數(shù)組
Flex:flex包含了flex-grow、flex-shrink、flex-basic
flex-grow:還有剩余空間時(shí),為此元素安排多少的空間
Flex-shrink:此元素寬度超出父級時(shí),壓縮多少
Flex-basic:指定元素寬度,優(yōu)先級高于width
盒模型:margin、border、padding、content
ie盒模型和普通的區(qū)別:ie的將border和padding計(jì)算至寬高內(nèi),而普通盒模型的寬高只計(jì)算content的真實(shí)寬高。
Box-sizing屬性會(huì)更改盒模型的標(biāo)準(zhǔn),content-box是普通盒模型,ie標(biāo)準(zhǔn)的是border-box。
獲取真實(shí)寬高使用window.getComputedStyle.width/height最為標(biāo)準(zhǔn)。
行內(nèi)元素margin上下無效,左右有效。padding均有效。
BFC:指一個(gè)通過特定條件達(dá)成的獨(dú)立容器,容器內(nèi)不不會(huì)受外部樣式影響
達(dá)成條件:
1.overflow除了visiable都可以,有scroll、hidden、auto。
float設(shè)置除了none都可以。
position設(shè)置了除了static都可以。
display設(shè)置:inline-block、table-cell、table-caption。
特性:
1.內(nèi)部元素會(huì)在垂直方向一個(gè)接一個(gè)的放置。
垂直方向元素距離靠上下文margin最大值來設(shè)置。
bfc內(nèi)區(qū)域不會(huì)和float區(qū)域重疊。
計(jì)算bfc區(qū)域高度時(shí)會(huì)將float的高度也算進(jìn)去
容器內(nèi)部的子元素不會(huì)影響外部元素
margin重疊:借助bfc的概念,使原本兩個(gè)受影響的元素,將其中一個(gè)增加bfc父級。因?yàn)閎fc的獨(dú)立容器屬性,不會(huì)影響外部元素。
清除浮動(dòng):1.使用偽類或空白塊元素占位。必須是display:block且增加clear:both。clearboth是使元素的左右兩側(cè)都不允許浮動(dòng)元素存在。
將父級設(shè)置為bfc,因?yàn)閎fc區(qū)域高度會(huì)將float的高度也算入,所以不會(huì)使父級無高度。
除了bfc還有ifc:ifc是行內(nèi)格式化書寫:按照水平方向放置,一行放不下折行。不接受上下邊距,只接受左右。
達(dá)成條件:在一個(gè)塊元素中只有行內(nèi)元素。
rem原理:通過設(shè)置html(根元素)的font-size。內(nèi)部元素的1rem?= 1*fontsize
http和https區(qū)別:http為名文傳輸,不安全。https多了ssl加密協(xié)議,為加密傳輸。
前端怎么修改?所有js和css、靜態(tài)文件加載https地址。
proxy跨域原理:首先是http和https會(huì)引發(fā)跨域,不同域名、不同端口都會(huì)引發(fā)跨域。proxy原理是npm?run?dev時(shí)node服務(wù)會(huì)將請求轉(zhuǎn)發(fā)至proxy設(shè)置好的域名地址,所以跨域這一步是在服務(wù)端中間件解決的。
axios攔截器原理:axios實(shí)例可以通過設(shè)置實(shí)例的interceptor.request/response.use方法,來設(shè)置拿到數(shù)據(jù)后的一些列操作。原理:給axios原型設(shè)置可共享方法,如果有攔截器,會(huì)添加到axios返回的promise對象中,請求攔截會(huì)在發(fā)起前調(diào)用,相應(yīng)攔截會(huì)在拿到response后調(diào)用,并根據(jù)攔截規(guī)則返回?cái)?shù)據(jù)。
小程序冷熱啟動(dòng):冷啟動(dòng)是小程序已經(jīng)被銷毀。熱啟動(dòng)是未被銷毀,再次打開。
冷啟動(dòng)會(huì)重新走app中的onLunch,熱啟動(dòng)不會(huì)觸發(fā),只會(huì)觸發(fā)onshow周期。
為什么會(huì)被銷毀?小程序占用內(nèi)存過高或小程序置入后臺超過5分鐘。