1.原型鏈
- 在JavaScript中萬物都是對象羡洁,對象和對象之間也有關(guān)系辽话,并不是孤立存在的歇终。對象之間的繼承關(guān)系,在JavaScript中是通過prototype對象指向原型匙赞,再通過proto指向Object對象原型為止佛掖,這樣就形成了一個原型指向的鏈條妖碉,專業(yè)術(shù)語稱之為原型鏈。
- 在原型上定義的屬性和方法芥被,創(chuàng)建出來的實(shí)例也會擁有原型上的屬性和方法
- 實(shí)例上有屬性就用實(shí)例的屬性欧宜,實(shí)例上沒有就去找原型上的屬性,原型上沒有就去找原型的原型(原型鏈終極)上的屬性
2.this指向
1.方法調(diào)用拴魄,this指向擁有這個對象的本身
2.函數(shù)調(diào)用冗茸,this指向Windows
3.構(gòu)造函數(shù),this指向new出來的實(shí)例
4.上下文調(diào)用匹中,this指向(你要傳進(jìn)去)傳入的對象
- 1.this 不能被賦值夏漱,但可以被 call/apply 改變
- 2.this的指向在函數(shù)定義的時候是確定不了的,只有函數(shù)執(zhí)行的時候才能確定this到底指向誰顶捷,實(shí)際上this的最終指向的是那個最近調(diào)用它的對象
- 3.return 和 this 只能出現(xiàn)在函數(shù)內(nèi)
3.作用域與預(yù)解析
作用域
作用域: 只有方法(函數(shù))才有作用域挂绰,是指可訪問變量的集合(變量和函數(shù)可被訪問的范圍)----作用域產(chǎn)生于程序源代碼中定義變量的區(qū)域,在程序編碼階段就確定了服赎。javascript 中分為全局作用域(Global context: window/global )和局部作用域(Local Scope , 又稱為函數(shù)作用域 Function context)葵蒂。簡單講作用域就是當(dāng)前函數(shù)的生成環(huán)境或者上下文,包含了當(dāng)前函數(shù)內(nèi)定義的變量以及對外層作用域的引用重虑。
作用域鏈:是一條變量對象的鏈,它和執(zhí)行期上下文(作用域)有關(guān),用于在處理標(biāo)識符的時候進(jìn)行變量查詢.践付,函數(shù)上下文的作用域鏈在函數(shù)調(diào)用的時候創(chuàng)建出來
預(yù)解析
- 在當(dāng)前作用域中,JavaScript代碼執(zhí)行之前缺厉,瀏覽器首先會默認(rèn)的把所有帶var和function聲明的變量進(jìn)行提前的聲明或者定義永高。
- 聲明:var num; 告訴瀏覽器在全局作用域中有一個num變量了,如果一個變量只是聲明了提针,但是沒有賦值命爬,默認(rèn)值是undefined。
定義:num = 12; 定義就是給變量進(jìn)行賦值关贵。
預(yù)解析只發(fā)生在當(dāng)前的作用域下
var聲明的變量和function聲明的函數(shù)在預(yù)解析的時候有區(qū)別遇骑,var聲明的變量在預(yù)解析的時候只是提前的聲明卖毁,function聲明的函數(shù)在預(yù)解析的時候會提前聲明并且會同時定義揖曾。也就是說var聲明的變量和function聲明的函數(shù)的區(qū)別是在聲明的同時有沒同時進(jìn)行定義。預(yù)編譯:變量聲明聲明提升亥啦,函數(shù)聲明整體提升
JS運(yùn)行三部曲:
1炭剪、語法分析
2、預(yù)編譯
3翔脱、解釋執(zhí)行代碼
簡單總結(jié):變量聲明提升奴拦,函數(shù)聲明整體提升
具體:
1、創(chuàng)建一個AO對象(Activation Object)執(zhí)行期上下文
2届吁、尋找形參和變量聲明作為AO對象屬性名错妖,值為undefined
3绿鸣、將實(shí)參與形參統(tǒng)一
4、在函數(shù)體中尋找函數(shù)聲明暂氯,值為函數(shù)體潮模、
4.new關(guān)鍵字
在函數(shù)里面創(chuàng)建一個空對象,將函數(shù)里的this指向這個新創(chuàng)建的對象(xxx),再返回這個obj對象
1、創(chuàng)建一個空對象
var obj=new Object();
2痴施、設(shè)置原型鏈
obj.proto= Func.prototype;
3擎厢、讓Functionj中的this指向obj,并執(zhí)行Function的函數(shù)體辣吃。
var result =Func.call(obj);
4动遭、判斷Func的返回值類型:
如果是值類型,返回obj神得。如果是引用類型厘惦,就返回這個引用類型的對象。
5.閉包
- 概念: 閉包就是有權(quán)訪另一個函數(shù)作用域中變量的函數(shù)
- 產(chǎn)生的原因: 因?yàn)楹瘮?shù)作用域的問題
- 形式: 比如一個a函數(shù)中return一個函數(shù)哩簿,在return得這個函數(shù)中使用a函數(shù)中的變量绵估,
- 缺陷:
- 因?yàn)樽兞吭诒皇褂盟詿o法被垃圾回收機(jī)制回收
- 變量得不到釋放,增加內(nèi)存使用率,很容易造成內(nèi)存泄漏
6.pormise
1.回調(diào)地獄
function a(functionb(){
c(function d(){
})
})
我們發(fā)現(xiàn)上面代碼大量使用了回調(diào)函數(shù)(將一個函數(shù)作為參數(shù)傳遞給另個函數(shù))并且有許多 })結(jié)尾的符號,使得代碼看起來很混亂卡骂。
2.三個狀態(tài): pending(初始值国裳,等待), fulfilled(resolve)(代表操作成功),rejected(代表操作失斎纭)
3.promise使用:
有兩個·參數(shù):(resolve,recject),resolve接受成功的參數(shù)缝左,recject接受失敗的,解決回調(diào)地獄使用鏈?zhǔn)骄幊膛ㄈ簦趖hen回調(diào)中return一個新的promise渺杉。當(dāng)我們的頁面渲染需要所有請求數(shù)據(jù)一起回來是才開始,我們可以使用promise.all方法挪钓,這個方法的特性是需要等所有的請求結(jié)果回來是才執(zhí)行回調(diào)函數(shù).then(),說到這個還有一個promise.reace方法是越,它的特性是最先執(zhí)行完的請求去使用.then()回調(diào)函數(shù)當(dāng)然在平時使用我們一般會使用async await,
4.async/await:
將異步請求變?yōu)橥酱a,同時的async/await無法捕獲錯誤碌上,我們需要使用倚评,try/catch來捕獲錯誤
是一個用同步思維解決異步問題的方案
async用于聲明一個函數(shù)是異步的。而await從字面意思上是“等待”的意思馏予,就是用于等待異步完成天梧。并且await只能在async函數(shù)中使用
通常async、await都是跟隨Promise一起使用的
7.跨域
webSockets
websocket是一個實(shí)時通訊協(xié)議霞丧,可以和服務(wù)端建立一個通道:服務(wù)器可以主動向客戶端推送信息呢岗,客戶端也可以主動向服務(wù)端發(fā)送信息。
跨域
-
跨域是由瀏覽器同源政策引起的,是指頁面請求的地址后豫,必須與頁面url地址處于(域名悉尾,端口,協(xié)議相同)挫酿,是為了防止某域名下的接口被其他域名下的網(wǎng)頁非法調(diào)用
解決跨域:
- 1:jsonp(瀏覽器只對XHR請求有同源請求限制焕襟,而對script標(biāo)簽的src屬性,link標(biāo)簽的ref屬性饭豹,img標(biāo)簽的src屬性沒有這種限制鸵赖,利用這個漏洞就可以很好解決跨域問題。jsonp就是利用script標(biāo)簽沒有同源政策限制的特點(diǎn)來實(shí)現(xiàn)解決跨域問題的)
- 2:代理服務(wù)器(因?yàn)橥凑呦拗浦淮嬖谟跒g覽器拄衰,服務(wù)器之間的請求是不受限制的它褪。通過一些方法設(shè)置代理,將不同域名轉(zhuǎn)換為相同的翘悉,客戶端發(fā)送請求是茫打,不直接發(fā)送到線上的服務(wù)器,而是先發(fā)送到本地的代理服務(wù)器妖混,再把代理服務(wù)器當(dāng)做一個跳板老赤,再將請求發(fā)送到線上服務(wù)器。同理制市,服務(wù)器的回應(yīng)也是先通過代理服務(wù)器再轉(zhuǎn)向客戶端)
- 3:websocket(是一個持久化的實(shí)時通信協(xié)議抬旺,客戶端和服務(wù)端建立了一個通道)
8.Ajax
異步請求對象,用于前后端數(shù)據(jù)交互的技術(shù)祥楣,可以在不重新加載網(wǎng)頁的情況下开财,局部更新網(wǎng)頁內(nèi)容的技術(shù)
實(shí)現(xiàn):
new一個XMLHttpRequest對象
open 打開通道,設(shè)置請求的url參數(shù)误褪,一是請求類型责鳍,二是請求的url,可以帶參數(shù)兽间,動態(tài)傳遞參數(shù)到服務(wù)端
send發(fā)送請求
onreadystatechange只要狀態(tài)改變就會調(diào)用历葛,使用監(jiān)聽事件監(jiān)聽數(shù)據(jù)什么時候回來
9.get與post請求的區(qū)別
1.get在瀏覽器回退是是無害的,post會再次提交請求
2.post請求比get 請求慢
3.get請求URL地址會被標(biāo)識
4.post更安全
5.post可以發(fā)送的數(shù)據(jù)更大
10.防抖與節(jié)流
1.防抖
- 原理:兩次點(diǎn)擊的時間間隔小于一定時間時嘀略,只執(zhí)行后一次
- 實(shí)現(xiàn):聲明一個a變量不賦值恤溶,將一個定時器函數(shù)賦值給這個變量a,在未賦值前清除這個定時器,
- 應(yīng)用場景:實(shí)現(xiàn)登錄功能時
2.節(jié)流
- 原理:一段時間內(nèi)函數(shù)只執(zhí)行一次屎鳍,例子(好比一個漏水的水龍頭宏娄,隔一段時間會滴一滴水)
- 實(shí)現(xiàn):在外部聲明一個變量a,賦值為true,相當(dāng)于是一個開關(guān),使用一個if判斷判斷條件是變量a逮壁,內(nèi)部放要執(zhí)行的函數(shù)體,在一進(jìn)入if的時候立馬將變量a賦值為false,再用一個定時器粮宛,內(nèi)部將變量a變?yōu)閠rue
- 應(yīng)用場景:無限上拉刷新