什么是閉包
對(duì)于閉包,我是這么認(rèn)識(shí)的,在我們這個(gè)js當(dāng)中呢,變量分為兩種,一種叫全局變量,一種叫局部變量。在這個(gè)變量訪問的過程中,全局變量沒有問題,在任何地方都可以訪問到,麻煩就麻煩再局部變量,局部變量默認(rèn)情況下在函數(shù)外邊是訪問不到的,那這個(gè)事情怎么辦呢,我們就用閉包開始了。
我可以在這個(gè)函數(shù)內(nèi)部,再給他定義一個(gè)函數(shù),這個(gè)就是二重函數(shù),我們分為父和子兩個(gè)函數(shù),那么父函數(shù)內(nèi)聲明的變量,在子函數(shù)內(nèi)是可以訪問到的。而子函數(shù)的這個(gè)方法我們認(rèn)為這是一個(gè)特權(quán)函數(shù),他可以訪問父函數(shù)中的變量,以及其他方法,這就是閉包產(chǎn)生的由來 。
那他解決的問題是什么呢,是因?yàn)樵蹅冇袝r(shí)在寫一些插件或者寫一些東西的時(shí)候,確實(shí)是需要調(diào)用父方法中的局部變量的,那這個(gè)時(shí)候只能對(duì)外寫一個(gè)接口,就是這個(gè)子函數(shù)。
還有一個(gè),面向?qū)ο蟮娜筇卣骼锏姆庋b也是要用到閉包的,你怎么把這個(gè)變量封裝起來不讓外面訪問,提高代碼安全,那我們只能用閉包。
閉包的優(yōu)點(diǎn)總結(jié)下來就是:1解決了局部變量不能訪問的問題,2體現(xiàn)了面向?qū)ο缶幊讨械姆庋b思想。
雖然閉包有優(yōu)點(diǎn),但他同時(shí)也存在缺點(diǎn):1閉包會(huì)浪費(fèi)很多內(nèi)存資源2閉包會(huì)導(dǎo)致內(nèi)存泄漏,同時(shí)內(nèi)存的數(shù)據(jù)能遭受攻擊,容易造成機(jī)器的崩潰。
最后他也同時(shí)存在針對(duì)缺點(diǎn)的解決方法:1少用閉包2手動(dòng)清空(也就是說我聲明一個(gè)方法函數(shù),讓變量等于null,最后在執(zhí)行后調(diào)用那個(gè)方法)
這就是我對(duì)閉包的理解
談?wù)剬?duì)js當(dāng)中繼承的看法
那對(duì)繼承,我是這么看的。咱們這個(gè)繼承一般是針對(duì)父方法和子方法來說的,也就是說有兩個(gè)方法,一個(gè)父方法,一個(gè)子方法。子方法可以擁有父方法的所有屬性以及方法,那對(duì)于我們來說,js中常用的繼承有3種。
第一種原型鏈繼承:子對(duì)象他有一個(gè)默認(rèn)屬性是叫proto,他是指向這個(gè)方法本身,而方法本身他是不帶父對(duì)象的方法或者屬性的,所以他得調(diào)用他的prototype 的屬性,這個(gè)prototype屬性他又指向一個(gè)對(duì)象,這個(gè)對(duì)象是子方法的原型,那么這個(gè)原型他又是用父方法實(shí)例化出來的,所以他又是他父對(duì)象的proto,這個(gè)proto又指向的父對(duì)象本身內(nèi)個(gè)prototype,這個(gè)prototype 又調(diào)用他里面的 屬性和方法,這樣的話就是他的原型鏈
繼承。
第二個(gè)叫構(gòu)造函數(shù)繼承, 構(gòu)造函數(shù)繼承最重要的一點(diǎn)就是冒充,父對(duì)象定義在子對(duì)象
里面,在子對(duì)象里面可以引用父對(duì)象的屬性和方法,構(gòu)造函數(shù)繼承我感覺比較簡(jiǎn)單。
再往后就是混合繼承,那就是既有構(gòu)造,又有原型,這樣的一種繼承方式。
這就是我對(duì)繼承的一種看法。
(call和apply之間的區(qū)別:兩種方法雖然都是繼承屬性,但書寫格式存在不同
這里call方法是通過this 后跟著一個(gè)字符串系列
而apply方法同樣也是通過this 不過傳屬性則是由數(shù)組構(gòu)成
)
ajax
分為兩種:原生的ajax / jquery的ajax
ajax是什么: 異步提交數(shù)據(jù)(同步)
刷新頁面,整張頁面閃爍————》同步
當(dāng)你在頁面上操作時(shí),是局部閃爍(進(jìn)度條)————》異步
什么是無刷新:整頁不用刷新,局部刷新
工作原理
首先要知道,ajax觸發(fā)是由事件觸發(fā),onmouseover onclick onchange
還有一個(gè)事件,這個(gè)事件就是負(fù)責(zé)監(jiān)控的,onreadystatechange()
readystated
0 還沒有完成初始化
1 已經(jīng)調(diào)用的open方法,還沒有調(diào)用send方法
2 已經(jīng)調(diào)用完了send方法
3 已經(jīng)接收到了服務(wù)器的部分?jǐn)?shù)據(jù),但是還沒有全部接受完
4 已經(jīng)接收到全部的數(shù)據(jù),響應(yīng)結(jié)束
還有一個(gè)status 狀態(tài)值
當(dāng)status狀態(tài)值為200時(shí),也就意味著,這個(gè)訪問成功了
最后得到一個(gè)返回值,responseText,是以一種序列化的字符串的形式出現(xiàn)
實(shí)例:假設(shè)點(diǎn)擊按鈕,通過原生的ajax獲取到j(luò)son數(shù)據(jù)
通過try catch的方式創(chuàng)建ajax對(duì)象
Function ajaxObj(){
var xhr;
//異常處理,錯(cuò)誤處理
try{ //嘗試執(zhí)行
Xhr=new ActiveXObject(“Microsoft.XMLHTTP”) //ie創(chuàng)建ajax
}catch(e){ //執(zhí)行失敗,捕獲異常時(shí)觸發(fā) e為錯(cuò)誤對(duì)象
Xhr=new XMLHttpRequest(); // 其他瀏覽器創(chuàng)建ajax對(duì)象
}
xhr.open(“get”,”a.php”,true); xhr.open(“method方法”,”路徑”,”同步或異步”)
xhr.send(null);
xhr.onreadystatechange=function(){ //閉包
If(xhr.readystate==4 && xhr.status==200){
alert(xhr.responseText) //注意:此時(shí)返回的json數(shù)據(jù)是以序列化字符串的格式返回的
}
}
}
被jquery簡(jiǎn)化后的ajax常用的屬性和方法
$.ajax({
url:””, //路徑
async:””, //同步或異步,同步false,異步true
dataType:””, //返回預(yù)期類型
method:””, //提交方法
success:function(e){ //成功時(shí)觸發(fā)的函數(shù),得到返回值
Alert(e)
}
})
六種數(shù)據(jù)類型:數(shù)值類型,文本類型,布爾類型,對(duì)象類型,null類型,underfined類型
(typeof操作符 解析變量后的數(shù)據(jù)類型)
(檢測(cè)對(duì)象類型 instanceof())
數(shù)值類型分為:整數(shù)型,浮點(diǎn)型,NAN
各個(gè)類型的方法
日期:toLocaleString() 將本地時(shí)間轉(zhuǎn)換成字符串
valueOf() 返回當(dāng)前data對(duì)象距1970年1月1號(hào)午夜的毫秒數(shù)
string類型:charAt() 返回指定位置的字符,括號(hào)內(nèi)輸入下標(biāo)
slice() 提取字符的某個(gè)部分
(x,y)存在兩個(gè)值時(shí),截取從x到y(tǒng)
(x)截取從x到字符串結(jié)束
(-x)截取從后往前查時(shí)的x到字符串結(jié)束
substr() (x,y)截取以為起點(diǎn),共y個(gè)字符
indexOf() 返回括號(hào)內(nèi)的值在字符串中首次出現(xiàn)的位置
lastindexOf() 返回括號(hào)內(nèi)的值在字符串中最后一次出現(xiàn)的位置
數(shù)組類型: length 返回?cái)?shù)組中元素的個(gè)數(shù)
數(shù)組名.Instanceof.Array / Array.isArray(數(shù)組名) 判斷是否為數(shù)組
push() 在數(shù)組末尾增加一個(gè)或多個(gè)元素
delete 數(shù)組名[下標(biāo)] 刪除數(shù)組指定下標(biāo)的元素
(區(qū)別:添加時(shí)元素長(zhǎng)度增加,刪除時(shí)元素長(zhǎng)度不變)
pop() 刪除并返回元素的最后一個(gè)值
join() 將數(shù)組中所有元素轉(zhuǎn)化為字符串,以括號(hào)中的符號(hào)拼接在一起
reverse() 將數(shù)組的順序顛倒
sort() 將數(shù)組元素進(jìn)行排序(字母按順序排序,數(shù)字不定)
slice() 截取數(shù)組片段,將其返回
(x,y)存在兩個(gè)值時(shí),截取從x到y(tǒng)
(x)一個(gè)值時(shí)截取從對(duì)應(yīng)下標(biāo)到數(shù)組結(jié)尾
splice() 用于插入,刪除或替換數(shù)組的元素
構(gòu)造方法原型鏈繼承的思路
每一個(gè)javaScript構(gòu)造方法都有一個(gè)名稱為prototype的屬性,可以指向另一個(gè)對(duì)象。當(dāng)我們?cè)L問對(duì)象屬性時(shí),javaScript引擎會(huì)從對(duì)象的所有屬性中查找該屬性,如果找到就返回屬性值,如果沒有找到就繼續(xù)從prototype屬性指向的對(duì)象屬性中查找,如果仍然沒有找到,則會(huì)沿著prototype鏈一直查找下去,知道找到屬性或者prototype鏈結(jié)束。