面試題話術(shù)

什么是閉包

對(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é)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進(jìn)階之旅閱讀 115,556評(píng)論 24 450
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,687評(píng)論 18 399
  • 遼闊大地,岸柳青青,鶯飛草長(zhǎng),小麥拔節(jié),油菜花香,桃紅李白迎春黃。 這就是春天,是桃李爭(zhēng)妍的季節(jié),...
    李小佳閱讀 1,377評(píng)論 0 2
  • 剛懷孕的時(shí)候,熙寶總是說要一個(gè)妹妹,幼兒園老師,市場(chǎng)買菜的叔叔,隔壁的阿姨都會(huì)逗她,你媽媽會(huì)給你生個(gè)弟弟吧!她都會(huì)...
    趙慧姿閱讀 266評(píng)論 2 2

友情鏈接更多精彩內(nèi)容