前端面試題總結(jié)

一.簡述前端構(gòu)建工具。fis3Gulp,Grunt,Webpack

www.tuicool.com/articles/beU7736

答:

(1)類是任務(wù)管理工具(task runner)。通過聲明和組合構(gòu)建任務(wù)來進(jìn)行整個(gè)網(wǎng)站的構(gòu)建, 有自己的一套任務(wù)聲明語法和任務(wù)實(shí)現(xiàn)接口。例如Grunt和Gulp,這兩個(gè)都是插件式的架構(gòu)。有大量的插件可用,缺點(diǎn)就在于做什么都只能用插件,沒有就自己寫一個(gè)。

(2)類是打包工具(package tool)。通過為每一類文件配置需要的處理方式,來實(shí)現(xiàn)整個(gè)站點(diǎn)的構(gòu)建。如WebpackFIS,這兩個(gè)都是整個(gè)站點(diǎn)的整體構(gòu)建解決方案。fis3的使用方法見blog.csdn.net/lululove19870526/article/details/49891253

(3)類是構(gòu)建工具(build tool)。比如Make。


詳細(xì)介紹:

Webpack:Webpack 是當(dāng)下最熱門的前端資源模塊化管理和打包工具。它可以將許多松散的模塊按照依賴和規(guī)則打包成符合生產(chǎn)環(huán)境部署的前端資源。還可以將按需加載的模塊進(jìn)行代碼分隔,等到實(shí)際需要的時(shí)候再異步加載。通過 loader 的轉(zhuǎn)換,任何形式的資源都可以視作模塊,比如 CommonJs 模塊、 AMD 模塊、 ES6 模塊、CSS、圖片、 JSON、Coffeescript、 LESS 等。

webpack的優(yōu)點(diǎn)如下:

1. webpack遵循commonJS的形式,但對AMD/CMD的支持也很全面,方便舊項(xiàng)目進(jìn)行代碼遷移。

2.能被模塊化的不僅僅是JS,所有的靜態(tài)資源,例如css,圖片等都能模塊化,即以require的方式引入。

3.開發(fā)便捷,能替代部分grunt/gulp的工作,比如打包、壓縮混淆、圖片轉(zhuǎn)base64等。


Grunt:grunt是一套前端自動化工具,一個(gè)基于nodeJs的命令行工具,一般用于:壓縮文件,合并文件,簡單語法檢查。

Grunt的優(yōu)點(diǎn)如下:

Grunt生態(tài)系統(tǒng)非常龐大,并且一直在增長。由于擁有數(shù)量龐大的插件可供選擇,因此,你可以利用Grunt自動完成任何事,并且花費(fèi)最少的代價(jià)。如果找不到你所需要的插件,那就自己動手創(chuàng)造一個(gè)Grunt插件,然后將其發(fā)布到npm上吧


Gulp:基于流的自動化構(gòu)建工具。文件的壓縮打包合并,是一個(gè)純粹的工具,并不能將你的css等非js資源模塊化,通過代碼優(yōu)于配置的策略,Gulp 讓簡單的任務(wù)簡單,復(fù)雜的任務(wù)可管理。

構(gòu)建快速

利用 Node.js 流的威力,你可以快速構(gòu)建項(xiàng)目并減少頻繁的 IO 操作。

插件高質(zhì)

Gulp 嚴(yán)格的插件指南確保插件如你期望的那樣簡潔高質(zhì)得工作。

易于學(xué)習(xí)

通過最少的 API,掌握 Gulp 毫不費(fèi)力,構(gòu)建工作盡在掌握:如同一系列流管道

二.sass和less有什么區(qū)別?

答:

1.編譯環(huán)境不一樣

Sass的安裝需要Ruby環(huán)境,是在服務(wù)端處理的,而Less是需要引入less.js來處理Less代碼輸出css到瀏覽器,也可以在開發(fā)環(huán)節(jié)使用Less,然后編譯成css文件,直接放到項(xiàng)目中。

2.變量符不一相,less是@,而scss是$,而且它們的作用域也不一樣,less是塊級作用域

3.輸出設(shè)置,Less沒有輸出設(shè)置,sass供4種輸出選項(xiàng),nested,compact,compressed和expanded

nested:嵌套縮進(jìn)的css代碼(默認(rèn))

expanded:展開的多行css代碼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? compact:簡潔格式的css代碼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?compressed:壓縮后的css代碼

4.sass支持條件語句,可以使用if{}else{},for{}循環(huán)等等,而less不行

5.引用外部css文件,sass引用外部文件必須以_開頭,文件名如果以下劃線_形狀,sass會認(rèn)為該文件是一個(gè)引用文件,不會將其編譯為css文件。less引用外部文件和css中的@import沒什么差異。

6.sass和less的工具庫不同。sass有工具庫Compass,簡單說,sass和Compass的關(guān)系有點(diǎn)像Javascript和jQuery的關(guān)系,Compass是sass的工具庫。在它的基礎(chǔ)上,封裝了一系列有用的模塊和模板,補(bǔ)充強(qiáng)化了sass的功能。less有UI組件庫Bootstrap,Bootstrap是web前端開發(fā)中一個(gè)比較有名的前端UI組件庫,Bootstrap的樣式文件部分源碼就是采用less語法編寫。

總結(jié):不管是sass,還是less,都可以視為一種基于CSS之上的高級語言,其目的是使得CSS開發(fā)更靈活和更強(qiáng)大,sass的功能比less強(qiáng)大,基本可以說是一種真正的編程語言了,less則相對清晰明了,易于上手,對編譯環(huán)境要求比較寬松??紤]到編譯sass要安裝Ruby,而Ruby官網(wǎng)在國內(nèi)訪問不了,個(gè)人在實(shí)際開發(fā)中更傾向于選擇less

三.sessionStorage和localstroage與cookie之間有什么關(guān)聯(lián)和區(qū)別,cookie最大存放多少字節(jié)

答:

三者共同點(diǎn):都是保存在瀏覽器端,且同源的。

1、cookie在瀏覽器和服務(wù)器間來回傳遞。而sessionStorage和localStorage不會自動把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存

2、存儲大小限制也不同,cookie數(shù)據(jù)不能超過4k,sessionStorage和localStorage但比cookie大得多,可以達(dá)到5M

3、數(shù)據(jù)有效期不同,sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉前有效,自然也就不可能持久保持;localStorage:始終有效,窗口或?yàn)g覽器關(guān)閉也一直保存,因此用作持久數(shù)據(jù);cookie只在設(shè)置的cookie過期時(shí)間之前一直有效,即使窗口或?yàn)g覽器關(guān)閉

4、作用域不同,sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個(gè)頁面(即數(shù)據(jù)不共享);localStorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的(即數(shù)據(jù)共享)。




四.前端開發(fā)的優(yōu)化問題

答:

(1) 減少http請求次數(shù):CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網(wǎng)頁Gzip,CDN托管,data緩存 ,圖片服務(wù)器。

(2) 前端模板 JS+數(shù)據(jù),減少由于HTML標(biāo)簽導(dǎo)致的帶寬浪費(fèi),前端用變量保存AJAX請求結(jié)果,每次操作本地變量,不用請求,減少請求次數(shù)

(3) 用innerHTML代替DOM操作,減少DOM操作次數(shù),優(yōu)化javascript性能

(4) 用setTimeout來避免頁面失去響應(yīng)

(5) 用hash-table來優(yōu)化查找

(6) 當(dāng)需要設(shè)置的樣式很多時(shí)設(shè)置className而不是直接操作style

(7) 少用全局變量,緩存DOM節(jié)點(diǎn)查找的結(jié)果

(8) 緩存DOM節(jié)點(diǎn)查找的結(jié)果

(9) 避免使用CSS Expression(css表達(dá)式)又稱Dynamic properties(動態(tài)屬性)

(10) 圖片預(yù)加載,將樣式表放在頂部,將腳本放在底部加上時(shí)間戳。

(11) 避免在頁面的主體布局中使用table,table要等其中的內(nèi)容完全下載之后才會顯示出來,顯示比div+css布局慢


請說出三種減低頁面加載時(shí)間的方法

1、壓縮css、js文件

2、合并js、css文件,減少http請求

3、外部js、css文件放在最底下

4、減少dom操作,盡可能用變量替代不必要的dom操作




五.瀏覽器內(nèi)核問題和兼容問題

關(guān)于瀏覽器內(nèi)核

主要分成兩部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。

渲染引擎:負(fù)責(zé)取得網(wǎng)頁的內(nèi)容(HTML、XML、圖像等等)、整理訊息(例如加入CSS等),以及計(jì)算網(wǎng)頁的顯示方式,后會輸出至顯示器或打印機(jī)。瀏覽器的內(nèi)核的不同對于網(wǎng)頁的語法解釋會有不同,所以渲染的效果也不相同。所有網(wǎng)頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網(wǎng)絡(luò)內(nèi)容的應(yīng)用程序都需要內(nèi)核。

JS引擎則:解析和執(zhí)行javascript來實(shí)現(xiàn)網(wǎng)頁的動態(tài)效果。

最開始渲染引擎和JS引擎并沒有區(qū)分的很明確,后來JS引擎越來越獨(dú)立,內(nèi)核就傾向于只指渲染引擎。


談?wù)劄g覽器的內(nèi)核,并且說一下什么是內(nèi)核?

Trident (['tra?d(?)nt])--IE,Gecko (['gek??])--Firefox, Presto (['prest??])--opera,webkit—谷歌和Safari

瀏覽器內(nèi)核又可以分成兩部分:渲染引擎和 JS 引擎。它負(fù)責(zé)取得網(wǎng)頁的內(nèi)容(HTML、XML、圖像等等)、整理訊息(例如加入 CSS 等),以及計(jì)算網(wǎng)頁的顯示方式,然后會輸出至顯示器或打印機(jī)。JS 引擎則是解析 Javascript 語言,執(zhí)行 javascript 語言來實(shí)現(xiàn)網(wǎng)頁的動態(tài)效果。

寫出幾種IE6 BUG的解決方法

1.雙邊距BUG float引起的 使用display

2.3像素問題 使用float引起的 使用dislpay:inline -3px

3.超鏈接hover 點(diǎn)擊后失效 使用正確的書寫順序 link visited hover active

4.Ie z-index問題 給父級添加position:relative

5.Png 透明 使用js代碼 改

6.Min-height 最小高度 !Important 解決’

7.select 在ie6下遮蓋 使用iframe嵌套

8.為什么沒有辦法定義1px左右的寬度容器(IE6默認(rèn)的行高造成的,使用over:hidden,zoom:0.08 line-height:1px)



六.關(guān)于Ajax的面試題

ajax? 兼容性? ? 瀏覽器內(nèi)核? 請求之后的結(jié)果狀態(tài)(狀態(tài)碼)? ? 數(shù)據(jù)轉(zhuǎn)換? json數(shù)據(jù)轉(zhuǎn)換? ? 對象? 構(gòu)造函數(shù),原型鏈,閉包? ? 緩存cooks。

1.什么是ajax:

異步j(luò)avascript和XML,是指一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)。通過后臺與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下,對網(wǎng)頁的某部分進(jìn)行更新。

2.判斷AJAX瀏覽器是否支持

例子解釋:首先聲明一個(gè)保存 XMLHttpRequest 對象的 xmlHttp 變量。

然后使用 XMLHttp=new XMLHttpRequest() 來創(chuàng)建此對象。這條語句針對 Firefox、Opera 以及 Safari 瀏覽器。假如失敗,則嘗試針對 Internet Explorer 6.0+ 的 xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"),假如也不成功,則嘗試針對 Internet Explorer 5.5+ 的 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP")。

(3)請盡可能詳盡的解釋AJAX的工作原理和流程

答:第一步,創(chuàng)建ajax對象? var xxx = new XMLHttpRequest();

第二部,判斷數(shù)據(jù)傳輸方式(GET / POST)

第三部,綁定請求地址,打開鏈接open。 即 open(method,url,async);

第四步,發(fā)送send。即開始請求 send(string)? string:僅用于 POST 請求

第五步,獲取請求結(jié)果。


(4)xhr對象status ? readystate?readystate 0~4?說出幾個(gè)http協(xié)議狀態(tài)碼? 200 201 302 304 400 404 500?

答:

1.

status是XMLHttpRequest對象的一個(gè)屬性,表示響應(yīng)的HTTP狀態(tài)碼。readyState是XMLHttpRequest對象的一個(gè)屬性,用來標(biāo)識當(dāng)前XMLHttpRequest對象處于什么狀態(tài)。

2.

0:未初始化狀態(tài):此時(shí),已經(jīng)創(chuàng)建了一個(gè)XMLHttpRequest對象

1: 準(zhǔn)備發(fā)送狀態(tài):此時(shí),已經(jīng)調(diào)用了XMLHttpRequest對象的open方法,并且XMLHttpRequest對象已經(jīng)準(zhǔn)備好將一個(gè)請求發(fā)送到服務(wù)器端

2:已經(jīng)發(fā)送狀態(tài):此時(shí),已經(jīng)通過send方法把一個(gè)請求發(fā)送到服務(wù)器端,但是還沒有收到一個(gè)響應(yīng)

3:正在接收狀態(tài):此時(shí),已經(jīng)接收到HTTP響應(yīng)頭部信息,但是消息體部分還沒有完全接收到

4:完成響應(yīng)狀態(tài):此時(shí),已經(jīng)完成了HTTP響應(yīng)的接收

3.

200:請求成功

201:請求成功并且服務(wù)器創(chuàng)建了新的資源

302:服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來響應(yīng)以后的請求。

304:自從上次請求后,請求的網(wǎng)頁未修改過。服務(wù)器返回此響應(yīng)時(shí),不會返回網(wǎng)頁內(nèi)容。

400:服務(wù)器不理解請求的語法

404:請求的資源(網(wǎng)頁等)不存在

500: 內(nèi)部服務(wù)器錯(cuò)誤


5)如何處理ajax請求之后后臺傳過來的數(shù)據(jù)

在上面我們能看見初步獲取了 str,即獲取到后臺來的數(shù)據(jù),有時(shí)候后臺在數(shù)據(jù)發(fā)過來之前就進(jìn)行過處理,我們 JS 獲取到就是對象,這樣就很簡單省事了。但是有時(shí)候后臺人員直接傳過來的是字符串形式,這樣就需要我們苦逼的前端去處理一下數(shù)據(jù)了。然后問題就來了我們該怎么去處理字符串,哪種處理方式更好;

目前js處理有兩種:1、eval()。2、JSON.parse();那么這兩種有什么區(qū)別呢?

注意:eval()的功能是把對應(yīng)的字符串解析成JS代碼并運(yùn)行;應(yīng)該避免使用eval,不安全,非常耗性能(2個(gè)步驟,一次解析成js語句,一次執(zhí)行)

(6)ajax緩存原理


ajax的缺點(diǎn)

1、ajax不支持瀏覽器back按鈕。

2、安全問題AJAX暴露了與服務(wù)器交互的細(xì)節(jié)。

3、對搜索引擎的支持比較弱。

4、破壞了程序的異常機(jī)制。

(7)ajax請求方式有幾種


如果你指定了 dataType 選項(xiàng),請確保服務(wù)器返回正確的 MIME 信息,(如 xml 返回"text/xml")。

實(shí)例:

保存數(shù)據(jù)到服務(wù)器,成功時(shí)顯示信息。

$.ajax({

type:"post",

dataType:"html",

url:'/Resources/GetList.ashx',

data: dataurl,

success: function (data) {if(data !="") {

$("#pager").pager({ pagenumber: pagenumber, pagecount: data.split("$")[1], buttonClickCallback: PageClick });

$("#anhtml").html(data.split("$")[0]);

}

}

});

(8)ajax和jsonp

答:

相同點(diǎn):都是請求一個(gè)url

不同點(diǎn):ajax的核心是通過xmlHttpRequest獲取內(nèi)容

jsonp的核心則是動態(tài)添加<script>標(biāo)簽來調(diào)用服務(wù)器,提供的js腳本標(biāo)簽來調(diào)用服務(wù)器 供的js腳本。

標(biāo)簽來調(diào)用服務(wù)器提供的js腳本標(biāo)簽來調(diào)用服務(wù)器提供的js腳本標(biāo)簽來調(diào)用服務(wù)器提供的js腳本。


標(biāo)簽來調(diào)用服務(wù)器? 供的js腳本。

(9)關(guān)于跨域問題

blog.csdn.net/joyhen/article/details/21631833

答:(1)jsonp是用script標(biāo)簽的src屬性是不跨域的這一性質(zhì),所以其實(shí)是封裝了這個(gè)功能而已,jquery會創(chuàng)建一個(gè)script標(biāo)簽,把src的地址指向后端,src會帶一個(gè)callback參數(shù),一般是一個(gè)函數(shù)名,后端根據(jù)這個(gè)請求,獲取參數(shù),然后把需要返回的數(shù)據(jù)包裹在這個(gè)函數(shù)內(nèi),前端獲得了這些js代碼,就會執(zhí)行這個(gè)callback,自然就把數(shù)據(jù)傳到客戶端了。只支持GET請求參考文檔

(2)cors(cross-origin resource sharing)就是服務(wù)端加上一句 header(“Access-Control-Allow-Origin:*”); 支持所有請求,但是兼容性不太好,支持IE8+,chrome3+。 (3)window.name.一個(gè)窗口window的生命周期內(nèi),窗口載入的頁面共享一個(gè)window.name,每個(gè)頁面都有讀寫權(quán)限, data.html里面就寫上window.name=”data..”;然后在a.html里用一個(gè)隱藏的iframe載入data.html,然后在a.html里用js把iframe的src設(shè)為同源的一個(gè)頁面。

(4)修改document.domain的方法只適用于不同子域的框架間的交互。比如http://www.example.com/a.html和 http:example.com/b.html 在兩個(gè)頁面中都修改document.domain為”example.com”

(5)img標(biāo)簽的src也是不跨域的,所以可以

img.src=“http://example.com/data?value=123。

但是這種方法只能用來發(fā)送請求.

(6)HTML5有一個(gè)postMessage(data,origin)方法,可以向當(dāng)前頁面中的iframe或者當(dāng)前頁彈出的窗口發(fā)送消息

1,jsonp


2,PHP端修改header ? 利用CORS


3,代理:

例如www.123.com/index.html需要調(diào)用www.456.com/server.php,可以寫一個(gè)接口www.123.com/server.php,由這個(gè)接口在后端去調(diào)用www.456.com/server.php并拿到返回值,然后再返回給index.html,這就是一個(gè)代理的模式。相當(dāng)于繞過了瀏覽器端,自然就不存在跨域問題。

4,document.domain + iframe? ? ? (只有在主域相同的時(shí)候才能使用該方法)

問題:

1、安全性,當(dāng)一個(gè)站點(diǎn)被攻擊后,另一個(gè)站點(diǎn)會引起安全漏洞。

2、如果一個(gè)頁面中引入多個(gè)iframe,要想能夠操作所有iframe,必須都得設(shè)置相同domain。

5.window.name + iframe

window.name 的美妙之處:name 值在不同的頁面(甚至不同域名)加載后依舊存在,并且可以支持非常長的 name 值(2MB)。

1) 創(chuàng)建a.com/cs1.html

2) 創(chuàng)建a.com/proxy.html,并加入如下代碼


6.web sockets


七.關(guān)于HTTP的問題總結(jié)? :(http://www.360doc.com/content/10/0930/17/3668821_57590979.shtml)


osi七種模型介紹 https://www.zybang.com/question/f05fd53d632bfa9dd5fef66552234c84.html?ssl=1)



一個(gè)頁面從輸入U(xiǎn)RL到頁面加載顯示完成,這個(gè)過程中都發(fā)生了什么?

這個(gè)過程可以分為四個(gè)步驟:

1.當(dāng)發(fā)送一個(gè)URL請求時(shí),不管這個(gè)URL是web頁面的URL還是web頁面的每個(gè)資源的URL,瀏覽器都會開啟一個(gè)線程來處理這個(gè)請求,同時(shí)在遠(yuǎn)程DNS服務(wù)器上啟動一個(gè)DNS查詢,這樣就可以使得瀏覽器獲得請求對應(yīng)的IP地址了。

2.瀏覽器通過與遠(yuǎn)程web服務(wù)器TCP三次握手協(xié)商來建立一個(gè)TCP/IP鏈接。三個(gè)握手包含一個(gè)同步報(bào)文,一個(gè)同步-應(yīng)答報(bào)文和一個(gè)應(yīng)答報(bào)文,這三個(gè)報(bào)文在瀏覽器和服務(wù)器之間進(jìn)行傳遞,該握手首先由客戶端嘗試建立起通信,而后服務(wù)器應(yīng)答并接受客戶端的請求,最后由由客戶端發(fā)出該請求已經(jīng)被接受的報(bào)文。

3.一旦TCP/IP鏈接建立,瀏覽器會通過該鏈接向遠(yuǎn)程服務(wù)器發(fā)送HTTP的GET請求。遠(yuǎn)程服務(wù)器找到資源并使用HTTP響應(yīng)返回該資源,值為200的HTTP狀態(tài)碼表示一個(gè)正確的響應(yīng)。

4.此時(shí),web服務(wù)器提供資源服務(wù),客戶端開始下載資源。

簡單來說,瀏覽器會解析HTML生成DOM tree,其次會根據(jù)CSS生成CSS rule tree,而javascript又可以根據(jù)DOM api操作DOM

在這里再歸納下http狀態(tài)嗎有哪些?它們分別代表什么意思?

要熟悉前后端的通信流程,最好把動態(tài)網(wǎng)站的背后細(xì)節(jié)也介紹一遍


八.AMD,CMD,CommonJS以及RequireJS和SeaJS的個(gè)人感悟

AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。

CMD 是 SeaJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。

類似的還有 CommonJS Modules/2.0 規(guī)范,是 BravoJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出。

這些規(guī)范的目的都是為了 JavaScript 的模塊化開發(fā),特別是在瀏覽器端的。

目前這些規(guī)范的實(shí)現(xiàn)都能達(dá)成瀏覽器端模塊化開發(fā)的目的。

AMD與CDM的區(qū)別:

1.對于于依賴的模塊,AMD 是提前執(zhí)行(好像現(xiàn)在也可以延遲執(zhí)行了),CMD 是延遲執(zhí)行。

2.AMD 推崇依賴前置,CMD 推崇依賴就近。

3.AMD 推崇復(fù)用接口,CMD 推崇單用接口。

4.書寫規(guī)范的差異,不具體說明了。

1. 對于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行。

不過 RequireJS 從 2.0 開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同,處理方式不同)。CMD 推崇 as lazy as possible.

2. CMD 推崇依賴就近,AMD 推崇依賴前置??创a:

// CMD

define(function(require, exports, module) {

var a = require('./a')

a.doSomething()

// 此處略去 100 行

var b = require('./b') // 依賴可以就近書寫

b.doSomething()

// ...

})

// AMD 默認(rèn)推薦的是

define(['./a', './b'], function(a, b) { // 依賴必須一開始就寫好

a.doSomething()

// 此處略去 100 行

b.doSomething()

...

})

雖然 AMD 也支持 CMD 的寫法,同時(shí)還支持將 require 作為依賴項(xiàng)傳遞,但 RequireJS 的作者默認(rèn)是最喜歡上面的寫法,也是官方文檔里默認(rèn)的模塊定義寫法。

3. AMD 的 API 默認(rèn)是一個(gè)當(dāng)多個(gè)用,CMD 的 API 嚴(yán)格區(qū)分,推崇職責(zé)單一。比如 AMD 里,require 分全局 require 和局部 require,都叫 require。CMD 里,沒有全局 require,而是根據(jù)模塊系統(tǒng)的完備性,提供 seajs.use 來實(shí)現(xiàn)模塊系統(tǒng)的加載啟動。CMD 里,每個(gè) API 都簡單純粹。

4. 還有一些細(xì)節(jié)差異,具體看這個(gè)規(guī)范的定義就好,就不多說了。

另外,SeaJS 和 RequireJS 的差異,可以參考

執(zhí)行模塊的機(jī)制大不一樣

-----------------------------------

由于 RequireJS 是執(zhí)行的 AMD 規(guī)范, 因此所有的依賴模塊都是先執(zhí)行.

使用 RequireJS 默認(rèn)定義模塊的方式, 在理解上會更清楚一些, 但個(gè)人還是偏愛 require('./mod1') 這樣的方式

define(['dep1', 'dep2'], function (dep1, dep2) {

//Define the module value by returning a value.

return function () {};

});

SeaJS 和 RequireJS 的差異

SeaJS只會在真正需要使用(依賴)模塊時(shí)才執(zhí)行該模塊

SeaJS是異步加載模塊的沒錯(cuò), 但執(zhí)行模塊的順序也是嚴(yán)格按照模塊在代碼中出現(xiàn)(require)的順序

而RequireJS會先盡早地執(zhí)行(依賴)模塊, 相當(dāng)于所有的require都被提前了, 而且模塊執(zhí)行的順序也不一定100%就是先mod1再mod2

因此你看到執(zhí)行順序和你預(yù)想的完全不一樣! 顫抖吧~ RequireJS!


CommonJS:就是用來規(guī)范JS的使用的,主要為了JS在后端的表現(xiàn)制定的,不太適合前端。它定了三個(gè)模塊:模塊引用的require,模塊定義的exports和模塊標(biāo)識module。CommonJS是一種規(guī)范,包括很多內(nèi)容,NodeJS是這種規(guī)范的實(shí)現(xiàn)。

RequireJS與SeaJS 都是模塊加載器。RequireJS工作于web瀏覽器端,同時(shí)也工作于web服務(wù)器端,SeaJS專注于web瀏覽器端。

網(wǎng)站:1?www.cnblogs.com/jackyWHJ/articles/4943271.html

入門requirejs ? http://www.runoob.com/w3cnote/requirejs-tutorial-2.html

異步加載的方式有哪些?

方案一:標(biāo)簽的async="async"屬性(詳細(xì)參見:script標(biāo)簽的async屬性)

方案二:標(biāo)簽的defer="defer"屬性標(biāo)簽的defer="defer"屬性方案三:動態(tài)創(chuàng)建標(biāo)簽方案四:AJAX eval(使用AJAX得到腳本內(nèi)容,然后通過eval_r(xmlhttp.responseText)來運(yùn)行腳本)方案五:iframe方式

方案三:動態(tài)創(chuàng)建標(biāo)簽

方案四:AJAX eval(使用AJAX得到腳本內(nèi)容,然后通過eval_r(xmlhttp.responseText)來運(yùn)行腳本)

方案五:iframe方式


類型九:對于線程·和進(jìn)程的理解


操作系統(tǒng)的設(shè)計(jì),因此可以歸結(jié)為三點(diǎn):

(1)以多進(jìn)程形式,允許多個(gè)任務(wù)同時(shí)運(yùn)行;

(2)以多線程形式,允許單個(gè)任務(wù)分成不同的部分運(yùn)行;

(3)提供協(xié)調(diào)機(jī)制,一方面防止進(jìn)程之間和線程之間產(chǎn)生沖突,另一方面允許進(jìn)程之間和線程之間共享資源。

3.區(qū)別

進(jìn)程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。進(jìn)程有獨(dú)立的地址空間,一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會對其它進(jìn)程產(chǎn)生影響,而線程只是一個(gè)進(jìn)程中的不同執(zhí)行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨(dú)的地址空間,一個(gè)線程死掉就等于整個(gè)進(jìn)程死掉,所以多進(jìn)程的程序要比多線程的程序健壯,但在進(jìn)程切換時(shí),耗費(fèi)資源較大,效率要差一些。但對于一些要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程,不能用進(jìn)程。

1)?簡而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程.

2)?線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。

3)?另外,進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

4)線程在執(zhí)行過程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。

5)從邏輯角度來看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。

4.優(yōu)缺點(diǎn)

線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。

類型十:關(guān)于Jquery

1.jquery 中如何將數(shù)組轉(zhuǎn)化為json字符串,然后再轉(zhuǎn)化回來?

jQuery中沒有提供這個(gè)功能,所以你需要先編寫兩個(gè)jQuery的擴(kuò)展:

$.fn.stringifyArray = function(array) {

return JSON.stringify(array)

}

$.fn.parseArray = function(array) {

return JSON.parse(array)

}

然后調(diào)用:

$("").stringifyArray(array)

2.jQuery中.bind() .live() .delegate() .on()的區(qū)別

類型十一:關(guān)于js

1.說說你對this的理解?

在JavaScript中,this通常指向的是我們正在執(zhí)行的函數(shù)本身,或者是,指向該函數(shù)所屬的對象。

全局的this → 指向的是Window

函數(shù)中的this → 指向的是函數(shù)所在的對象

對象中的this → 指向其本身

2.繼承的幾種方式 ?www.cnblogs.com/humin/p/4556820.html

1.原型鏈繼承

2.借用構(gòu)造函數(shù)繼承

3.組合繼承(原型+借用構(gòu)造)

4.原型式繼承

5.寄生式繼承

6.寄生組合式繼承


構(gòu)造函數(shù).prototype= 原型對象

原型對象.constructor = 構(gòu)造函數(shù)(模板)

原型對象.isPrototypeof(實(shí)例對象)? 判斷實(shí)例對象的原型 是不是當(dāng)前對象

3.關(guān)于事件

(1)關(guān)于事件,IE與火狐的事件機(jī)制有什么區(qū)別? 如何阻止冒泡?

[1].在IE中,事件對象是作為一個(gè)全局變量來保存和維護(hù)的.所有的瀏覽器事件,不管是用戶觸發(fā)的,還是其他事件,都會更新window.event對象.所以在代碼中,只要調(diào)用window.event就可以獲取事件對象, 再event.srcElement就可以取得觸發(fā)事件的元素進(jìn)行進(jìn)一步處理.

[2].在FireFox中,事件對象卻不是全局對象,一般情況下,是現(xiàn)場發(fā)生,現(xiàn)場使用,F(xiàn)ireFox把事件對象自動傳給事件處理程序.

關(guān)于事件的兼容性處理要熟練掌握,事件對象具體哪些屬性存在兼容性問題,IE與標(biāo)準(zhǔn)事件模型事件冒泡與事件捕獲的支持要理解

(2)如何阻止事件冒泡和默認(rèn)事件?

阻止瀏覽器的默認(rèn)行為

window.event?window.event.returnValue=false:e.preventDefault();

停止事件冒泡

window.event?window.event.cancelBubble=true:e.stopPropagation();

原生JavaScript中,return false;只阻止默認(rèn)行為,不阻止冒泡,jQuery中的return false;既阻止默認(rèn)行為,又阻止冒泡


4.關(guān)于window對象(event,navigator,history,location)

關(guān)于history(通過history.pushState無刷新改變url

http://www.myexception.cn/web/1955044.html

在瀏覽器中改變地址欄url,將會觸發(fā)頁面資源的重新加載,這使得我們可以在不同的頁面間進(jìn)行跳轉(zhuǎn),得以瀏覽不同的內(nèi)容。但隨著單頁應(yīng)用的增多,越來越多的網(wǎng)站采用ajax來加載資源。因?yàn)楫惒郊虞d的特性,地址欄上的資源路徑?jīng)]有被改變,隨之而來的問題就是頁面的狀態(tài)無法被保存。這導(dǎo)致我們難以通過熟悉的方式(點(diǎn)擊瀏覽器前進(jìn)/后退按鈕),在前后的頁面狀態(tài)間進(jìn)行切換。

為了解決ajax頁面狀態(tài)不能返回的問題,人們想出了一些曲線救國的方法,比如利用瀏覽器hash的特性,將新的資源路徑偽裝成錨點(diǎn),通過onhashchange事件來改變狀態(tài),同時(shí)又避免了瀏覽器刷新。但這樣始終顯得有些hack。

現(xiàn)在HTML5規(guī)范為window.history引入了兩個(gè)新api,pushState和replaceState,我們可以使用它很方便的達(dá)到改變url不重載頁面的目的


#hash最后再來介紹另一種無刷新技巧window.location.hash的使用。

URL中#稱為位置的標(biāo)識符,代表網(wǎng)頁中的一個(gè)位置,當(dāng)瀏覽器讀取這個(gè)URL后,會自動將可視區(qū)域滾動至所定義的錨點(diǎn)處。HTTP請求中不包括#,也就是說改變#后的內(nèi)容不會向服務(wù)器發(fā)起請求,因此也就不會引起頁面重載。

window.location.hash這個(gè)屬性可讀可寫。讀取時(shí),可以用來判斷網(wǎng)頁狀態(tài)是否改變;寫入時(shí),則會在不重載網(wǎng)頁的前提下,創(chuàng)造一條訪問歷史記錄。

當(dāng)#值發(fā)生變化時(shí),就會觸發(fā)onhashchange事件。


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

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

  • 1.一些開放性題目 1.自我介紹:除了基本個(gè)人信息以外,面試官更想聽的是你與眾不同的地方和你的優(yōu)勢。 2.項(xiàng)目介紹...
    dyy水晶閱讀 247評論 0 0
  • HTML HTML5標(biāo)簽 媒體查詢head部分寫法 Doctype作用? 嚴(yán)格模式與混雜模式如何區(qū)分?它們有何意義...
    Mayo_閱讀 719評論 0 8
  • http://www.qdfuns.com/notes/23515/c9163ddd620baac5dd23141...
    你聽cmy1994閱讀 334評論 0 0
  • 1.幾種基本數(shù)據(jù)類型?復(fù)雜數(shù)據(jù)類型?值類型和引用數(shù)據(jù)類型?堆棧數(shù)據(jù)結(jié)構(gòu)? 基本數(shù)據(jù)類型:Undefined、Nul...
    極樂君閱讀 5,878評論 0 106
  • 和你在一起的日子是粉紅色的,我們一樣熱愛著大海。大狗和小貓,大寶和小寶,我們有各種各樣的昵稱,但怎樣都繞不開,我們...
    西瓜貓閱讀 652評論 0 0

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