---轉載javascript
使用閉包主要是爲了設計私有的方法和變量。閉包的優勢是能夠避免全局變量的污染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易形成內存泄露。css
閉包有三個特性:html
>1.函數嵌套函數
>2.函數內部能夠引用外部的參數和變量
>3.參數和變量不會被垃圾回收機制回收
請你談談Cookie的弊端前端
`cookie`雖然在持久保存客戶端數據提供了方便,分擔了服務器存儲的負擔,但仍是有不少侷限性的。html5
第一:每一個特定的域名下最多生成20個`cookie`java
1.IE6或更低版本最多20個cookie
2.IE7和以後的版本最後能夠有50個cookie。
3.Firefox最多50個cookie
4.chrome和Safari沒有作硬性限制
`IE`和`Opera` 會清理近期最少使用的`cookie`,`Firefox`會隨機清理`cookie`。node
`cookie`的最大大約爲`4096`字節,爲了兼容性,通常不能超過`4095`字節。css3
IE 提供了一種存儲能夠持久化用戶數據,叫作`userdata`,從`IE5.0`就開始支持。每一個數據最多128K,每一個域名下最多1M。這個持久化數據放在緩存中,若是緩存沒有清理,那麼會一直存在。程序員
優勢:極高的擴展性和可用性
1.經過良好的編程,控制保存在cookie中的session對象的大小。
2.經過加密和安全傳輸技術(SSL),減小cookie被破解的可能性。
3.只在cookie中存放不敏感數據,即便被盜也不會有重大損失。
4.控制cookie的生命期,使之不會永遠有效。偷盜者極可能拿到一個過時的cookie。
缺點:
1.`Cookie`數量和長度的限制。每一個domain最多隻能有20條cookie,每一個cookie長度不能超過4KB,不然會被截掉。
2.安全性問題。若是cookie被人攔截了,那人就能夠取得全部的session信息。即便加密也與事無補,由於攔截者並不須要知道cookie的意義,他只要原樣轉發cookie就能夠達到目的了。
3.有些狀態不可能保存在客戶端。例如,爲了防止重複提交表單,咱們須要在服務器端保存一個計數器。若是咱們把這個計數器保存在客戶端,那麼它起不到任何做用。
瀏覽器本地存儲web
在較高版本的瀏覽器中,`js`提供了`sessionStorage`和`globalStorage`。在`HTML5`中提供了`localStorage`來取代`globalStorage`。
`html5`中的`Web Storage`包括了兩種存儲方式:`sessionStorage`和`localStorage`。
`sessionStorage`用於本地存儲一個會話(session)中的數據,這些數據只有在同一個會話中的頁面才能訪問而且當會話結束後數據也隨之銷燬。所以`sessionStorage`不是一種持久化的本地存儲,僅僅是會話級別的存儲。
而`localStorage`用於持久化的本地存儲,除非主動刪除數據,不然數據是永遠不會過時的。
`Web Storage`的概念和`cookie`類似,區別是它是爲了更大容量存儲設計的。`Cookie`的大小是受限的,而且每次你請求一個新的頁面的時候`Cookie`都會被髮送過去,這樣無形中浪費了帶寬,另外`cookie`還須要指定做用域,不能夠跨域調用。
除此以外,`Web Storage`擁有`setItem,getItem,removeItem,clear`等方法,不像`cookie`須要前端開發者本身封裝`setCookie,getCookie`。
可是`cookie`也是不能夠或缺的:`cookie`的做用是與服務器進行交互,做爲`HTTP`規範的一部分而存在 ,而`Web Storage`僅僅是爲了在本地「存儲」數據而生
瀏覽器的支持除了`IE7`及如下不支持外,其餘標準瀏覽器都徹底支持(ie及FF需在web服務器裏運行),值得一提的是IE老是辦好事,例如IE7、IE6中的`userData`其實就是`javascript`本地存儲的解決方案。經過簡單的代碼封裝能夠統一到全部的瀏覽器都支持`web storage`。
`localStorage`和`sessionStorage`都具備相同的操做方法,例如`setItem、getItem`和`removeItem`等
cookie 和session 的區別:
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
五、因此我的建議:
將登錄信息等重要信息存放爲SESSION
其餘信息若是須要保留,能夠放在COOKIE中
display:none和visibility:hidden的區別?
display:none 隱藏對應的元素,在文檔佈局中再也不給它分配空間,它各邊的元素會合攏,
就當他歷來不存在。
visibility:hidden 隱藏對應的元素,可是在文檔佈局中仍保留原來的空間。
CSS中 link 和@import 的區別是?
(1) link屬於HTML標籤,而@import是CSS提供的;
(2) 頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載;
(3) import只在IE5以上才能識別,而link是HTML標籤,無兼容問題;
(4) link方式的樣式的權重 高於@import的權重.
position:absolute和float屬性的異同
A:共同點:
對內聯元素設置`float`和`absolute`屬性,可讓元素脫離文檔流,而且能夠設置其寬高。
B:不一樣點:
float仍會佔據位置,position會覆蓋文檔流中的其餘元素。
介紹一下box-sizing屬性?
`box-sizing`屬性主要用來控制元素的盒模型的解析模式。默認值是`content-box`。
- `content-box`:讓元素維持W3C的標準盒模型。元素的寬度/高度由border + padding + content的寬度/高度決定,設置width/height屬性指的是content部分的寬/高
- `border-box`:讓元素維持IE傳統盒模型(IE6如下版本和IE6~7的怪異模式)。設置width/height屬性指的是border + padding + content
標準瀏覽器下,按照W3C規範對盒模型解析,一旦修改了元素的邊框或內距,就會影響元素的盒子尺寸,就不得不從新計算元素的盒子尺寸,從而影響整個頁面的佈局。
CSS 選擇符有哪些?哪些屬性能夠繼承?優先級算法如何計算? CSS3新增僞類有那些?
1.id選擇器( # myid)
2.類選擇器(.myclassname)
3.標籤選擇器(div, h1, p)
4.相鄰選擇器(h1 + p)
5.子選擇器(ul > li)
6.後代選擇器(li a)
7.通配符選擇器( * )
8.屬性選擇器(a[rel = "external"])
9.僞類選擇器(a: hover, li:nth-child)
* 可繼承的樣式: font-size font-family color, text-indent;
* 不可繼承的樣式:border padding margin width height ;
* 優先級就近原則,同權重狀況下樣式定義最近者爲準;
* 載入樣式以最後載入的定位爲準;
>優先級爲:
!important > id > class > tag
important 比 內聯優先級高,但內聯比 id 要高
>CSS3新增僞類舉例:
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每一個 <p> 元素。 p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每一個 <p> 元素。 p:only-of-type 選擇屬於其父元素惟一的 <p> 元素的每一個 <p> 元素。 p:only-child 選擇屬於其父元素的惟一子元素的每一個 <p> 元素。 p:nth-child(2) 選擇屬於其父元素的第二個子元素的每一個 <p> 元素。 :enabled :disabled 控制表單控件的禁用狀態。 :checked 單選框或複選框被選中。
position的值, relative和absolute分別是相對於誰進行定位的?
absolute
生成絕對定位的元素, 相對於最近一級的 定位不是 static 的父元素來進行定位。
fixed (老IE不支持)
生成絕對定位的元素,相對於瀏覽器窗口進行定位。
relative
生成相對定位的元素,相對於其在普通流中的位置進行定位。
static 默認值。沒有定位,元素出如今正常的流中
CSS3有哪些新特性?
CSS3實現圓角(border-radius),陰影(box-shadow),
對文字加特效(text-shadow、),線性漸變(gradient),旋轉(transform)
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋轉,縮放,定位,傾斜
增長了更多的CSS選擇器 多背景 rgba
在CSS3中惟一引入的僞元素是::selection.
媒體查詢,多欄佈局
border-image
XML和JSON的區別?
(1).數據體積方面。
JSON相對於XML來說,數據的體積小,傳遞的速度更快些。
(2).數據交互方面。
JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互。
(3).數據描述方面。
JSON對數據的描述性比XML較差。
(4).傳輸速度方面。
JSON的速度要遠遠快於XML。
對BFC規範的理解?
BFC,塊級格式化上下文,一個建立了新的BFC的盒子是獨立佈局的,盒子裏面的子元素的樣式不會影響到外面的元素。在同一個BFC中的兩個毗鄰的塊級盒在垂直方向(和佈局方向有關係)的margin會發生摺疊。
(W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行佈局,以及與其餘元素的關係和相互做用。)
解釋下 CSS sprites,以及你要如何在頁面或網站中使用它。
CSS Sprites其實就是把網頁中一些背景圖片整合到一張圖片文件中,再利用CSS的「background-image」,「background- repeat」,「background-position」的組合進行背景定位,background-position能夠用數字能精確的定位出背景圖片的位置。這樣能夠減小不少圖片請求的開銷,由於請求耗時比較長;請求雖然能夠併發,可是也有限制,通常瀏覽器都是6個。對於將來而言,就不須要這樣作了,由於有了`http2`。
說說你對語義化的理解?
1,去掉或者丟失樣式的時候可以讓頁面呈現出清晰的結構
2,有利於SEO:和搜索引擎創建良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來肯定上下文和各個關鍵字的權重;
3,方便其餘設備解析(如屏幕閱讀器、盲人閱讀器、移動設備)以意義的方式來渲染網頁;
4,便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標準的團隊都遵循這個標準,能夠減小差別化。
Doctype做用? 嚴格模式與混雜模式如何區分?它們有何意義?
(1)、<!DOCTYPE> 聲明位於文檔中的最前面,處於 <html> 標籤以前。告知瀏覽器以何種模式來渲染文檔。 (2)、嚴格模式的排版和 JS 運做模式是 以該瀏覽器支持的最高標準運行。 (3)、在混雜模式中,頁面以寬鬆的向後兼容的方式顯示。模擬老式瀏覽器的行爲以防止站點沒法工做。 (4)、DOCTYPE不存在或格式不正確會致使文檔以混雜模式呈現。
你知道多少種Doctype文檔類型? 該標籤可聲明三種 DTD 類型,分別表示嚴格版本、過渡版本以及基於框架的 HTML 文檔
HTML 4.01 規定了三種文檔類型:Strict、Transitional 以及 Frameset。
XHTML 1.0 規定了三種 XML 文檔類型:Strict、Transitional 以及 Frameset。
Standards (標準)模式(也就是嚴格呈現模式)用於呈現遵循最新標準的網頁,而 Quirks
(包容)模式(也就是鬆散呈現模式或者兼容模式)用於呈現爲傳統瀏覽器而設計的網頁。
區別: 1.全部的標記都必需要有一個相應的結束標記 2.全部標籤的元素和屬性的名字都必須使用小寫 3.全部的XML標記都必須合理嵌套 4.全部的屬性必須用引號""括起來 5.把全部<和&特殊符號用編碼表示 6.給全部屬性賦一個值 7.不要在註釋內容中使「--」 8.圖片必須有說明文字
* png24位的圖片在iE6瀏覽器上出現背景,解決方案是作成PNG8.也能夠引用一段腳本處理.
* 瀏覽器默認的margin和padding不一樣。解決方案是加一個全局的*{margin:0;padding:0;}來統一。
* IE6雙邊距bug:塊屬性標籤float後,又有橫行的margin狀況下,在ie6顯示margin比設置的大。
* 浮動ie產生的雙倍距離(IE6雙邊距問題:在IE6下,若是對元素設置了浮動,同時又設置了margin-left或margin-right,margin值會加倍。)
#box{ float:left; width:10px; margin:0 0 0 100px;}
這種狀況之下IE會產生20px的距離,解決方案是在float的標籤樣式控制中加入 ——_display:inline;將其轉化爲行內屬性。(_這個符號只有ie6會識別)
* 漸進識別的方式,從整體中逐漸排除局部。
首先,巧妙的使用「\9」這一標記,將IE遊覽器從全部狀況中分離出來。
接着,再次使用「+」將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
css .bb{ /*全部識別*/ . /*IE六、七、8識別*/ +/*IE六、7識別*/ _/*IE6識別*/ }
* IE下,可使用獲取常規屬性的方法來獲取自定義屬性,
也可使用getAttribute()獲取自定義屬性;
Firefox下,只能使用getAttribute()獲取自定義屬性.
解決方法:統一經過getAttribute()獲取自定義屬性.
* IE下,event對象有x,y屬性,可是沒有pageX,pageY屬性;
Firefox下,event對象有pageX,pageY屬性,可是沒有x,y屬性.
* 解決方法:(條件註釋)缺點是在IE瀏覽器下可能會增長額外的HTTP請求數。
* Chrome 中文界面下默認會將小於 12px 的文本強制按照 12px 顯示,
可經過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.
* 超連接訪問事後hover樣式就不出現了 被點擊訪問過的超連接樣式不在具備hover和active瞭解決方法是改變CSS屬性的排列順序:
L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}
* 怪異模式問題:漏寫DTD聲明,Firefox仍然會按照標準模式來解析網頁,但在IE中會觸發怪異模式。爲避免怪異模式給咱們帶來沒必要要的麻煩,最好養成書寫DTD聲明的好習慣。如今可使用[html5](http://www.w3.org/TR/html5/single-page.html)推薦的寫法:`<doctype html>`
* 上下margin重合問題
ie和ff都存在,相鄰的兩個div的margin-left和margin-right不會重合,可是margin-top和margin-bottom卻會發生重合。
解決方法,養成良好的代碼編寫習慣,同時採用margin-top或者同時採用margin-bottom。
* ie6對png圖片格式支持很差(引用一段腳本處理)
解釋下浮動和它的工做原理?清除浮動的技巧
浮動元素脫離文檔流,不佔據空間。浮動元素碰到包含它的邊框或者浮動元素的邊框停留。
1.使用空標籤清除浮動。
這種方法是在全部浮動標籤後面添加一個空標籤 定義css clear:both. 弊端就是增長了無心義標籤。
2.使用overflow。
給包含浮動元素的父標籤添加css屬性 overflow:auto; zoom:1; zoom:1用於兼容IE6。
3.使用after僞對象清除浮動。
該方法只適用於非IE瀏覽器。具體寫法可參照如下示例。使用中需注意如下幾點。1、該方法中必須爲須要清除浮動元素的僞對象中設置 height:0,不然該元素會比實際高出若干像素;
浮動元素引發的問題和解決辦法?
浮動元素引發的問題:
(1)父元素的高度沒法被撐開,影響與父元素同級的元素
(2)與浮動元素同級的非浮動元素(內聯元素)會跟隨其後
(3)若非第一個元素浮動,則該元素以前的元素也須要浮動,不然會影響頁面顯示的結構
解決方法:
使用`CSS`中的`clear:both`;屬性來清除元素的浮動可解決2、3問題,對於問題1,添加以下樣式,給父元素添加`clearfix`樣式:
.clearfix:after{content: ".";display: block;height: 0;clear: both;visibility: hidden;} .clearfix{display: inline-block;} /* for IE/Mac */
**清除浮動的幾種方法:**
1,額外標籤法,<div style="clear:both;"></div>(缺點:不過這個辦法會增長額外的標籤使HTML結構看起來不夠簡潔。) 2,使用after僞類 #parent:after{ content:"."; height:0; visibility:hidden; display:block; clear:both; }
3,浮動外部元素
4,設置`overflow`爲`hidden`或者auto
IE 8如下版本的瀏覽器中的盒模型有什麼不一樣
IE8如下瀏覽器的盒模型中定義的元素的寬高不包括內邊距和邊框
DOM操做——怎樣添加、移除、移動、複製、建立和查找節點。
(1)建立新節點 createDocumentFragment() //建立一個DOM片斷 createElement() //建立一個具體的元素 createTextNode() //建立一個文本節點 (2)添加、移除、替換、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子節點前插入一個新的子節點 (3)查找 getElementsByTagName() //經過標籤名稱 getElementsByName() //經過元素的Name屬性的值(IE容錯能力較強,會獲得一個數組,其中包括id等於name值的) getElementById() //經過元素Id,惟一性
html5有哪些新特性、移除了那些元素?如何處理HTML5新標籤的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
* HTML5 如今已經不是 SGML 的子集,主要是關於圖像,位置,存儲,多任務等功能的增長。
* 拖拽釋放(Drag and drop) API
語義化更好的內容標籤(header,nav,footer,aside,article,section)
音頻、視頻API(audio,video)
畫布(Canvas) API
地理(Geolocation) API
本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉後數據不丟失;
sessionStorage 的數據在瀏覽器關閉後自動刪除
表單控件,calendar、date、time、email、url、search
新的技術webworker, websocket, Geolocation
* 移除的元素
純表現的元素:basefont,big,center,font, s,strike,tt,u;
對可用性產生負面影響的元素:frame,frameset,noframes;
支持HTML5新標籤:
* IE8/IE7/IE6支持經過document.createElement方法產生的標籤,
能夠利用這一特性讓這些瀏覽器支持HTML5新標籤,
瀏覽器支持新標籤後,還須要添加標籤默認的樣式:
* 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://...../xx.js"</script>
<![endif]-->
如何區分: DOCTYPE聲明\新增的結構元素\功能元素
1.`<iframe>`優勢:
解決加載緩慢的第三方內容如圖標和廣告等的加載問題
Security sandbox
並行加載腳本
2.`<iframe>`的缺點:
*iframe會阻塞主頁面的Onload事件;
*即時內容爲空,加載也須要時間
*沒有語意
調用localstorge、cookies等本地存儲方式
一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,
由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。
這就是進程和線程的重要區別。
期待的解決方案包括:
文件合併
文件最小化/文件壓縮
使用 CDN 託管
緩存的使用(多個域名來提供緩存)
其餘
1.優化圖片
2.圖像格式的選擇(GIF:提供的顏色較少,可用在一些對顏色要求不高的地方)
3.優化CSS(壓縮合並css,如margin-top,margin-left...)
4.網址後加斜槓(如www.ij34.com/目錄,會判斷這個「目錄是什麼文件類型,或者是目錄。)
5.標明高度和寬度(若是瀏覽器沒有找到這兩個參數,它須要一邊下載圖片一邊計算大小,若是圖片不少,瀏覽器須要不斷地調整頁面。這不但影響速度,也影響瀏覽體驗。
當瀏覽器知道了高度和寬度參數後,即便圖片暫時沒法顯示,頁面上也會騰出圖片的空位,而後繼續加載後面的內容。從而加載時間快了,瀏覽體驗也更好了。)
6.減小http請求(合併文件,合併圖片)。
Profiler, JSPerf, Dromaeo
FOUC - Flash Of Unstyled Content 文檔樣式閃爍 <style type="text/css" media="all">@import "../fouc.css";</style> 而引用CSS文件的@import就是形成這個問題的罪魁禍首。IE會先加載整個HTML文檔的DOM,而後再去導入外部的CSS文件,所以,在頁面DOM加載完成到CSS導入完成中間會有一段時間頁面上的內容是沒有樣式的,這段時間的長短跟網速,電腦速度都有關係。 解決方法簡單的出奇,只要在<head>之間加入一個<link>或者<script>元素就能夠了。
`null`是一個表示"無"的對象,轉爲數值時爲0;`undefined`是一個表示"無"的原始值,轉爲數值時爲`NaN`。
當聲明的變量還未被初始化時,變量的默認值爲`undefined`。
`null`用來表示還沒有存在的對象,經常使用來表示函數企圖返回一個不存在的對象。
`undefined`表示"缺乏值",就是此處應該有一個值,可是尚未定義。典型用法是:
(1)變量被聲明瞭,但沒有賦值時,就等於undefined。
(2) 調用函數時,應該提供的參數沒有提供,該參數等於undefined。
(3)對象沒有賦值的屬性,該屬性的值爲undefined。
(4)函數沒有返回值時,默認返回undefined。
`null`表示"沒有對象",即該處不該該有值。典型用法是:
(1) 做爲函數的參數,表示該函數的參數不是對象。
(2) 做爲對象原型鏈的終點。
一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。 二、屬性和方法被加入到 this 引用的對象中。 三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。 var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
defer和async、動態建立DOM方式(建立script,插入到DOM中,加載完畢後callBack)、按需異步載入js
jsonp、 document.domain+iframe、window.name、window.postMessage、服務器上設置代理頁面
jsonp的原理是動態插入script標籤
具體參見:[詳解js跨域問題][2]
document.write只能重繪整個頁面
innerHTML能夠重繪頁面的一部分
做用:動態改變某個類的某個方法的運行環境。
區別參見:[JavaScript學習總結(四)function函數部分][3]
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
setTimeout 的第一個參數使用字符串而非函數的話,會引起內存泄漏。
閉包、控制檯日誌、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
詳見:[詳解js變量、做用域及內存][4]
詳見:[詳解JavaScript函數模式][5]
經過判斷Global對象是否爲window,若是不爲window,當前腳本沒有運行在瀏覽器中
你遇到過比較難的技術問題是?你是如何解決的?
列舉IE 與其餘瀏覽器不同的特性?
什麼叫優雅降級和漸進加強?
優雅降級:Web站點在全部新式瀏覽器中都能正常工做,若是用戶使用的是老式瀏覽器,則代碼會檢查以確認它們是否能正常工做。因爲IE獨特的盒模型佈局問題,針對不一樣版本的IE的hack實踐過優雅降級了,爲那些沒法支持功能的瀏覽器增長候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於徹底失效.
漸進加強:從被全部瀏覽器支持的基本功能開始,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面增長無害於基礎瀏覽器的額外樣式和功能的。當瀏覽器支持時,它們會自動地呈現出來併發揮做用。
詳見:[css學習概括總結(一)][6]
WEB應用從服務器主動推送Data到客戶端有那些方式?
Javascript數據推送 Commet:基於HTTP長鏈接的服務器推送技術 基於WebSocket的推送方案 SSE(Server-Send Event):服務器推送數據新方式
對前端界面工程師這個職位是怎麼樣理解的?它的前景會怎麼樣?
前端是最貼近用戶的程序員,比後端、數據庫、產品經理、運營、安全都近。 1、實現界面交互 2、提高用戶體驗 3、有了Node.js,前端能夠實現服務端的一些事情
前端是最貼近用戶的程序員,前端的能力就是能讓產品從 90分進化到 100 分,甚至更好,
參與項目,快速高質量完成實現效果圖,精確到1px;
與團隊成員,UI設計,產品經理的溝通;
作好的頁面結構,頁面重構和用戶體驗;
處理hack,兼容、寫出優美的代碼格式;
針對服務器的優化、擁抱最新前端技術。
([詳情請看雅虎14條性能優化原則][7])。
詳情:http://segmentfault.com/blog/trigkit4/1190000000691919
一個頁面從輸入 URL 到頁面加載顯示完成,這個過程當中都發生了什麼?
----------------------------------
(1) 減小http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN託管,data緩存 ,圖片服務器。 (2) 前端模板 JS+數據,減小因爲HTML標籤致使的帶寬浪費,前端用變量保存AJAX請求結果,每次操做本地變量,不用請求,減小請求次數 (3) 用innerHTML代替DOM操做,減小DOM操做次數,優化javascript性能。 (4) 當須要設置的樣式不少時設置className而不是直接操做style。 (5) 少用全局變量、緩存DOM節點查找的結果。減小IO讀取操做。 (6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。 (7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。
分爲4個步驟:
(1),當發送一個URL請求時,無論這個URL是Web頁面的URL仍是Web頁面上每一個資源的URL,瀏覽器都會開啓一個線程來處理這個請求,
同時在遠程DNS服務器上啓動一個DNS查詢。這能使瀏覽器得到請求對應的IP地址。
(2), 瀏覽器與遠程Web服務器經過TCP三次握手協商來創建一個TCP/IP鏈接。該握手包括一個同步報文,一個同步-應答報文和一個應答報文,
這三個報文在 瀏覽器和服務器之間傳遞。該握手首先由客戶端嘗試創建起通訊,然後服務器應答並接受客戶端的請求,最後由客戶端發出該請求已經被接受的報文。
(3),一旦TCP/IP鏈接創建,瀏覽器會經過該鏈接向遠程服務器發送HTTP的GET請求。遠程服務器找到資源並使用HTTP響應返回該資源,
值爲200的HTTP響應狀態表示一個正確的響應。
(4),此時,Web服務器提供資源服務,客戶端開始下載資源。
請求返回後,便進入了咱們關注的前端模塊
簡單來講,瀏覽器會解析HTML生成DOM Tree,其次會根據CSS生成CSS Rule Tree,而javascript又能夠根據DOM API操做DOM
詳情:[從輸入 URL 到瀏覽器接收的過程當中發生了什麼事情?][8]
先期團隊必須肯定好全局樣式(globe.css),編碼模式(utf-8) 等;
編寫習慣必須一致(例如都是採用繼承式的寫法,單樣式都寫成一行);
標註樣式編寫人,各模塊都及時標註(標註關鍵樣式調用的地方);
頁面進行標註(例如 頁面 模塊 開始和結束);
CSS跟HTML 分文件夾並行存放,命名都得統一(例如style.css);
JS 分文件夾存放 命名以該JS功能爲準的英文翻譯。
圖片採用整合的 images.png png8 格式文件使用 儘可能整合在一塊兒使用方便未來的管理
Node.js、Mongodb、npm、MVVM、MEAN、three.js,React 。
網站:w3cfuns,sf,hacknews,CSDN,慕課,博客園,InfoQ,w3cplus等
1,工廠模式
2,構造函數模式
3,原型模式
4,混合構造函數和原型模式
5,動態原型模式
6,寄生構造函數模式
7,穩妥構造函數模式
1,原型鏈繼承
2,借用構造函數繼承
3,組合繼承(原型+借用構造)
4,原型式繼承
5,寄生式繼承
6,寄生組合式繼承
詳情:[JavaScript繼承方式詳解][9]
(1)建立XMLHttpRequest對象,也就是建立一個異步調用對象.
(2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息.
(3)設置響應HTTP請求狀態變化的函數.
(4)發送HTTP請求.
(5)獲取異步調用返回的數據.
(6)使用JavaScript和DOM實現局部刷新.
詳情:[JavaScript學習總結(七)Ajax和Http狀態字][10]
1.異步加載的方案: 動態插入script標籤 2.經過ajax去獲取js代碼,而後經過eval執行 3.script標籤上添加defer或者async屬性 4.建立並插入iframe,讓它異步執行js 5.延遲加載:有些 js 代碼並非頁面初始化的時候就馬上須要的,而稍後的某些狀況才須要的。
sql注入原理
就是經過把`SQL`命令插入到`Web`表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
總的來講有如下幾點:
1.永遠不要信任用戶的輸入,要對用戶的輸入進行校驗,能夠經過正則表達式,或限制長度,對單引號和雙"-"進行轉換等。
2.永遠不要使用動態拼裝SQL,可使用參數化的SQL或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員權限的數據庫鏈接,爲每一個應用使用單獨的權限有限的數據庫鏈接。
4.不要把機密信息明文存放,請加密或者hash掉密碼和敏感的信息。
`Xss(cross-site scripting)`攻擊指的是攻擊者往Web頁面裏插入惡意`html`標籤或者`javascript`代碼。好比:攻擊者在論壇中放一個
看似安全的連接,騙取用戶點擊後,竊取cookie中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,
當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶本來覺得的信任站點。
1.代碼裏對用戶輸入的地方和變量都須要仔細檢查長度和對`」<」,」>」,」;」,」’」`等字符作過濾;其次任何內容寫到頁面以前都必須加以`encode`,避免不當心把`html tag` 弄出來。這一個層面作好,至少能夠堵住超過一半的`XSS` 攻擊。
<br/>
2.避免直接在`cookie` 中泄露用戶隱私,例如`email`、密碼等等。
3.經過使cookie 和系統ip 綁定來下降`cookie` 泄露後的危險。這樣攻擊者獲得的cookie 沒有實際價值,不可能拿來重放。
<br/>
4.儘可能採用POST 而非GET 提交表單
`XSS`是獲取信息,不須要提早知道其餘用戶頁面的代碼和數據包。`CSRF`是代替用戶完成指定的動做,須要知道其餘用戶頁面的代碼和數據包。
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登陸受信任網站A,並在本地生成Cookie。
2.在不登出A的狀況下,訪問危險網站B。
1.服務端的CSRF方式方法不少樣,但總的思想都是一致的,就是在客戶端頁面增長僞隨機數。
2.使用驗證碼
IE6 兩個併發,iE7升級以後的6個併發,以後版本也是6個
Firefox,chrome也是6個
用構造函數和原型鏈的混合模式去實現繼承,避免對象共享能夠參考經典的extend()函數,不少前端框架都有封裝的,就是用一個空函數當作中間變量
YUI Compressor 是一個用來壓縮 JS 和 CSS 文件的工具,採用Java開發。
使用方法:
//壓縮JS
java -jar yuicompressor-2.4.2.jar --type js --charset utf-8 -v src.js > packed.js
//壓縮CSS
java -jar yuicompressor-2.4.2.jar --type css --charset utf-8 -v src.css > packed.css
詳情請見:[你須要掌握的前端代碼性能優化工具][11]
1、Flash ajax對比
Flash適合處理多媒體、矢量圖形、訪問機器;對CSS、處理文本上不足,不容易被搜索。
Ajax對CSS、文本支持很好,支持搜索;多媒體、矢量圖形、機器訪問不足。
共同點:與服務器的無刷新傳遞消息、用戶離線和在線狀態、操做DOM
概念:同源策略是客戶端腳本(尤爲是`Javascript`)的重要的安全度量標準。它最先出自`Netscape Navigator2.0`,其目的是防止某個文檔或腳本從多個不一樣源裝載。
這裏的同源策略指的是:協議,域名,端口相同,同源策略是一種安全協議。
指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
咱們舉例說明:好比一個黑客程序,他利用`Iframe`把真正的銀行登陸頁面嵌到他的頁面上,當你使用真實的用戶名,密碼登陸時,他的頁面就能夠經過`Javascript`讀取到你的表單中`input`中的內容,這樣用戶名,密碼就輕鬆到手了。
`ECMAscript 5`添加了第二種運行模式:"嚴格模式"(strict mode)。顧名思義,這種模式使得`Javascript`在更嚴格的條件下運行。
設立"嚴格模式"的目的,主要有如下幾個:
- 消除Javascript語法的一些不合理、不嚴謹之處,減小一些怪異行爲; - 消除代碼運行的一些不安全之處,保證代碼運行的安全; - 提升編譯器效率,增長運行速度; - 爲將來新版本的Javascript作好鋪墊。 注:通過測試`IE6,7,8,9`均不支持嚴格模式。
缺點:
如今網站的`JS` 都會進行壓縮,一些文件用了嚴格模式,而另外一些沒有。這時這些原本是嚴格模式的文件,被 `merge` 後,這個串就到了文件的中間,不只沒有指示嚴格模式,反而在壓縮後浪費了字節。
GET:通常用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,通常在2000個字符
POST:通常用於修改服務器上的資源,對所發送的信息沒有限制。
GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值,
也就是說Get是經過地址欄來傳值,而Post是經過提交表單來傳值。
然而,在如下狀況中,請使用 POST 請求:
沒法使用緩存文件(更新服務器上的文件或數據庫)
向服務器發送大量數據(POST 沒有數據量限制)
發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
**js的阻塞特性:**全部瀏覽器在下載`JS`的時候,會阻止一切其餘活動,好比其餘資源的下載,內容的呈現等等。直到`JS`下載、解析、執行完畢後纔開始繼續`並行下載`其餘資源並呈現內容。爲了提升用戶體驗,新一代瀏覽器都支持並行下載`JS`,可是`JS`下載仍然會阻塞其它資源的下載(例如.圖片,css文件等)。
因爲瀏覽器爲了防止出現`JS`修改`DOM`樹,須要從新構建`DOM`樹的狀況,因此就會阻塞其餘的下載和呈現。
嵌入`JS`會阻塞全部內容的呈現,而外部`JS`只會阻塞其後內容的顯示,2種方式都會阻塞其後資源的下載。也就是說外部樣式不會阻塞外部腳本的加載,但會阻塞外部腳本的執行。
`CSS`怎麼會阻塞加載了?`CSS`原本是能夠並行下載的,在什麼狀況下會出現阻塞加載了(在測試觀察中,`IE6`下`CSS`都是阻塞加載)
當`CSS`後面跟着嵌入的`JS`的時候,該`CSS`就會出現阻塞後面資源下載的狀況。而當把嵌入`JS`放到`CSS`前面,就不會出現阻塞的狀況了。
根本緣由:由於瀏覽器會維持`html`中`css`和`js`的順序,樣式表必須在嵌入的JS執行前先加載、解析完。而嵌入的`JS`會阻塞後面的資源加載,因此就會出現上面`CSS`阻塞下載的狀況。
嵌入`JS`應該放在什麼位置?
1、放在底部,雖然放在底部照樣會阻塞全部呈現,但不會阻塞資源下載。
2、若是嵌入JS放在head中,請把嵌入JS放在CSS頭部。
3、使用defer(只支持IE)
4、不要在嵌入的JS中調用運行時間較長的函數,若是必定要用,能夠用`setTimeout`來調用
- **將腳本放在底部。**`<link>`仍是放在`head`中,用以保證在`js`加載前,能加載出正常顯示的頁面。`<script>`標籤放在`</body>`前。
- **成組腳本**:因爲每一個`<script>`標籤下載時阻塞頁面解析過程,因此限制頁面的`<script>`總數也能夠改善性能。適用於內聯腳本和外部腳本。
- **非阻塞腳本**:等頁面完成加載後,再加載`js`代碼。也就是,在`window.onload`事件發出後開始下載代碼。
(1)`defer`屬性:支持IE4和`fierfox3.5`更高版本瀏覽器
(2)動態腳本元素:文檔對象模型(DOM)容許你使用js動態建立`HTML`的幾乎所有文檔內容。代碼以下:
<br> <script> var script=document.createElement("script"); script.type="text/javascript"; script.src="file.js"; document.getElementsByTagName("head")[0].appendChild(script); </script>
此技術的重點在於:不管在何處啓動下載,文件額下載和運行都不會阻塞其餘頁面處理過程。即便在head裏(除了用於下載文件的http連接)。
詳情請見:[詳解js閉包][12]
詳情請見:[JavaScript學習總結(九)事件詳解][13]
它的功能是把對應的字符串解析成JS代碼並運行;
應該避免使用eval,不安全,很是耗性能(2次,一次解析成js語句,一次執行)。
* 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲null的話,咱們就稱之爲原型鏈。
* 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈。
1. 咱們在網頁中的某個操做(有的操做對應多個事件)。例如:當咱們點擊一個按鈕就會產生一個事件。是能夠被 JavaScript 偵測到的行爲。
2. 事件處理機制:IE是事件冒泡、firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件。;
3. ev.stopPropagation();注意舊ie的方法 ev.cancelBubble = true;
詳情請見:[JavaScript學習總結(七)Ajax和Http狀態字][14]
1. 經過異步模式,提高了用戶體驗
2. 優化了瀏覽器和服務器之間的傳輸,減小沒必要要的數據往返,減小了帶寬佔用
3. Ajax在客戶端運行,承擔了一部分原本由服務器承擔的工做,減小了大用戶量下的服務器負載。
2. Ajax的最大的特色是什麼。
Ajax能夠實現動態不刷新(局部刷新)
readyState屬性 狀態 有5個可取值: 0=未初始化 ,1=啓動 2=發送,3=接收,4=完成
ajax的缺點
1、ajax不支持瀏覽器back按鈕。
2、安全問題 AJAX暴露了與服務器交互的細節。
3、對搜索引擎的支持比較弱。
4、破壞了程序的異常機制。
5、不容易調試。
跨域: jsonp、 iframe、window.name、window.postMessage、服務器上設置代理頁面
function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; //建立一個空的數組 var i = Obj.length; while (i--) { buf[i] = clone(Obj[i]); } return buf; }else if (Obj instanceof Object){ buf = {}; //建立一個空對象 for (var k in Obj) { //爲這個對象添加新的屬性 buf[k] = clone(Obj[k]); } return buf; }else{ return Obj; } }
詳情請見:[詳解JavaScript模塊化開發][15]
網站重構:在不改變外部行爲的前提下,簡化結構、添加可讀性,而在網站前端保持一致的行爲。也就是說是在不改變UI的狀況下,對網站進行優化,在擴展的同時保持一致的UI。
對於傳統的網站來講重構一般是:
表格(table)佈局改成DIV+CSS
使網站前端兼容於現代瀏覽器(針對於不合規範的CSS、如對IE6有效的)
對於移動平臺的優化
針對於SEO進行優化
深層次的網站重構應該考慮的方面
減小代碼間的耦合
讓代碼保持彈性
嚴格按規範編寫代碼
設計可擴展的API
代替舊有的框架、語言(如VB)
加強用戶體驗
一般來講對於速度的優化也包含在重構中
壓縮JS、CSS、image等前端資源(一般是由服務器來解決)
程序的性能優化(如數據讀寫)
採用CDN來加速資源加載
對於JS DOM的優化
HTTP服務器的文件緩存
<script> function whatBrowser() { document.Browser.Name.value=navigator.appName; document.Browser.Version.value=navigator.appVersion; document.Browser.Code.value=navigator.appCodeName; document.Browser.Agent.value=navigator.userAgent; } </script>
如下是數組去重的三種方法:
Array.prototype.unique1 = function () { var n = []; //一個新的臨時數組 for (var i = 0; i < this.length; i++) //遍歷當前數組 { //若是當前數組的第i已經保存進了臨時數組,那麼跳過, //不然把當前項push到臨時數組裏面 if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; } Array.prototype.unique2 = function() { var n = {},r=[]; //n爲hash表,r爲臨時數組 for(var i = 0; i < this.length; i++) //遍歷當前數組 { if (!n[this[i]]) //若是hash表中沒有當前項 { n[this[i]] = true; //存入hash表 r.push(this[i]); //把當前數組的當前項push到臨時數組裏面 } } return r; } Array.prototype.unique3 = function() { var n = [this[0]]; //結果數組 for(var i = 1; i < this.length; i++) //從第二項開始遍歷 { //若是當前數組的第i項在當前數組中第一次出現的位置不是i, //那麼表示第i項是重複的,忽略掉。不然存入結果數組 if (this.indexOf(this[i]) == i) n.push(this[i]); } return n; }
//建立cookie function setCookie(name, value, expires, path, domain, secure) { var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value); if (expires instanceof Date) { cookieText += '; expires=' + expires; } if (path) { cookieText += '; expires=' + expires; } if (domain) { cookieText += '; domain=' + domain; } if (secure) { cookieText += '; secure'; } document.cookie = cookieText; } //獲取cookie function getCookie(name) { var cookieName = encodeURIComponent(name) + '='; var cookieStart = document.cookie.indexOf(cookieName); var cookieValue = null; if (cookieStart > -1) { var cookieEnd = document.cookie.indexOf(';', cookieStart); if (cookieEnd == -1) { cookieEnd = document.cookie.length; } cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd)); } return cookieValue; } //刪除cookie function unsetCookie(name) { document.cookie = name + "= ; expires=" + new Date(0); }
爲了準確無誤地把數據送達目標處,TCP協議採用了三次握手策略。用TCP協議把數據包送出去後,TCP不會對傳送 後的狀況置之不理,它必定會向對方確認是否成功送達。握手過程當中使用了TCP的標誌:SYN和ACK。
發送端首先發送一個帶SYN標誌的數據包給對方。接收端收到後,回傳一個帶有SYN/ACK標誌的數據包以示傳達確認信息。最後,發送端再回傳一個帶ACK標誌的數據包,表明「握手」結束
若在握手過程當中某個階段莫名中斷,TCP協議會再次以相同的順序發送相同的數據包。
依照 `Promise/A+` 的定義,`Promise` 有四種狀態:
pending: 初始狀態, 非 fulfilled 或 rejected.
fulfilled: 成功的操做.
rejected: 失敗的操做.
settled: Promise已被fulfilled或rejected,且不是pending
另外, `fulfilled` 與 `rejected` 一塊兒合稱 `settled`。
`Promise` 對象用來進行延遲(deferred) 和異步(asynchronous ) 計算。
>Promise 的構造函數
構造一個 `Promise`,最基本的用法以下:
var promise = new Promise(function(resolve, reject) { if (...) { // succeed resolve(result); } else { // fails reject(Error(errMessage)); } });
`Promise` 實例擁有 `then` 方法(具備 `then` 方法的對象,一般被稱爲 `thenable`)。它的使用方法以下:
promise.then(onFulfilled, onRejected)
接收兩個函數做爲參數,一個在 `fulfilled` 的時候被調用,一個在 `rejected` 的時候被調用,接收參數就是 `future,onFulfilled` 對應 `resolve`, `onRejected` 對應 `reject`。
Javascript垃圾回收方法
標記清除(mark and sweep)
這是`JavaScript`最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將其標記爲「進入環境」,當變量離開環境的時候(函數執行結束)將其標記爲「離開環境」。
垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,而後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成以後仍存在標記的就是要刪除的變量了
引用計數(reference counting)
在低版本`IE`中常常會出現內存泄露,不少時候就是由於其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每一個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,若是該變量的值變成了另一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值無法被訪問了,所以能夠將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間。
在IE中雖然`JavaScript`對象經過標記清除的方式進行垃圾回收,但BOM與DOM對象倒是經過引用計數回收垃圾的,也就是說只要涉及BOM及DOM就會出現循環引用問題。
代碼層面:避免使用css表達式,避免使用高級選擇器,通配選擇器。
緩存利用:緩存Ajax,使用CDN,使用外部js和css文件以便緩存,添加Expires頭,服務端配置Etag,減小DNS查找等
請求數量:合併樣式和腳本,使用css圖片精靈,初始首屏以外的圖片資源按需加載,靜態資源延遲加載。
請求帶寬:壓縮文件,開啓GZIP,
>儘可能使用`css3`動畫,開啓硬件加速。適當使用`touch`事件代替`click`事件。避免使用`css3`漸變陰影效果。
>儘量少的使用`box-shadow`與`gradients`。`box-shadow`與`gradients`每每都是頁面的性能殺手
瀏覽器下載組件的時候,會將它們存儲到瀏覽器緩存中。若是須要再次獲取相同的組件,瀏覽器將檢查組件的緩存時間,
假如已通過期,那麼瀏覽器將發送一個條件GET請求到服務器,服務器判斷緩存還有效,則發送一個304響應,
告訴瀏覽器能夠重用緩存組件。
那麼服務器是根據什麼判斷緩存是否還有效呢?答案有兩種方式,一種是前面提到的ETag,另外一種是根據`Last-Modified`
Expires和Cache-Control
`Expires`要求客戶端和服務端的時鐘嚴格同步。HTTP1.1引入`Cache-Control`來克服Expires頭的限制。若是max-age和Expires同時出現,則max-age有更高的優先級。
Cache-Control: no-cache, private, max-age=0 ETag: abcde Expires: Thu, 15 Apr 2014 20:00:00 GMT Pragma: private Last-Modified: $now // RFC1123 format
棧的插入和刪除操做都是在一端進行的,而隊列的操做倒是在兩端進行的。
隊列先進先出,棧先進後出。
棧只容許在表尾一端進行插入和刪除,而隊列只容許在表尾一端進行插入,在表頭一端進行刪除
棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。
堆區(heap) — 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。
堆(數據結構):堆能夠被當作是一棵樹,如:堆排序;
棧(數據結構):一種先進後出的數據結構。
`HTTP/2`引入了「服務端推(serverpush)」的概念,它容許服務端在客戶端須要數據以前就主動地將數據發送到客戶端緩存中,從而提升性能。
`HTTP/2`提供更多的加密支持
`HTTP/2`使用多路技術,容許多個消息在一個鏈接上同時交差。
它增長了頭壓縮(header compression),所以即便很是小的請求,其請求和響應的`header`都只會佔用很小比例的帶寬。