執行環節定義了函數或者變量能夠訪問的其它數據,決定了他們各自的行爲。
每一個執行環境都有一個與之關聯的變量對象,在環境中定義的全部變量和函數都保存在這個變量中,而且是咱們沒法訪問。
每一個函數都有本身的執行環境,當執行流進入一個函數的時候,就把函數的執行環境壓入執行環境棧,執行完畢後,再將環境推出,把控制權交給以前的執行環境。javascript
當代碼在一個環境中執行的時候,會建立變量對象的做用域鏈,做用域鏈的用途是保證對執行環境有權訪問的全部變量和函數的有序訪問。
做用域鏈的前端,始終都是當前執行代碼所在環境的變量對象.若是這個環境是函數,則將其活動對象做爲變量對象.做用域鏈中的下一個變量對象來自包含環境,最終到全局對象window.
延長做用域鏈 try catch 和 with語句.css
垃圾收集器在運行的時候會給存儲在內存中的全部變量都加上標記,而後,他會去掉環境中的變量以及被環境中變量引用的變量的標記.
而在此以後有標記的變量將被視爲準備刪除的變量.html
跟蹤記錄每一個值被引用的次數 ,經過引用來適當增長他的引用次數,當引用計數爲0時,代表該變量能夠被清除.前端
undefiend/變量未定義 boolean/布爾值 string/字符串 number/數值 object對象或者null function/函數 symbol/Symboljava
[注意]:web
全等比較前不會轉換操做數,其餘狀況同樣.算法
能夠分爲 強緩存和協商緩存chrome
1.強緩存:不會向服務器發送請求,直接從緩存中讀取資源,在chrome控制檯的network選項中能夠看到該請求返回200的狀態碼,而且size顯示from disk cache或from memory cache;數據庫
2.協商緩存:向服務器發送請求,服務器會根據這個請求的request header的一些參數來判斷是否命中協商緩存,若是命中,則返回304狀態碼並帶上新的response header通知瀏覽器從緩存中讀取資源;json
3.二者的共同點是,都是從客戶端緩存中讀取資源;區別是強緩存不會發請求,協商緩存會發請求
Expires:response header裏的過時時間,瀏覽器再次加載資源時,若是在這個過時時間內,則命中強緩存。
Cache-Control:當值設爲max-age=300時,則表明在這個請求正確返回時間(瀏覽器也會記錄下來)的5分鐘內再次加載資源,就會命中強緩存。
Expires和Cache-Control:max-age=* 的做用是差很少的,區別就在於 Expires 是http1.0的產物,Cache-Control是http1.1的產物,二者同時存在的話,Cache-Control優先級高於Expires;在某些不支持HTTP1.1的環境下,Expires就會發揮用處。因此Expires實際上是過期的產物,現階段它的存在只是一種兼容性的寫法
ETag和If-None-Match:這兩個要一塊兒說。Etag是上一次加載資源時,服務器返回的response header,是對該資源的一種惟一標識,只要資源有變化,Etag就會從新生成。瀏覽器在下一次加載資源向服務器發送請求時,會將上一次返回的Etag值放到request header裏的If-None-Match裏,服務器接受到If-None-Match的值後,會拿來跟該資源文件的Etag值作比較,若是相同,則表示資源文件沒有發生改變,命中協商緩存。
Last-Modified和If-Modified-Since:這兩個也要一塊兒說。Last-Modified是該資源文件最後一次更改時間,服務器會在response header裏返回,同時瀏覽器會將這個值保存起來,在下一次發送請求時,放到request header裏的If-Modified-Since裏,服務器在接收到後也會作比對,若是相同則命中協商緩存。
首先在精確度上,Etag要優於Last-Modified。Last-Modified的時間單位是秒,若是某個文件在1秒內改變了屢次,那麼他們的Last-Modified其實並無體現出來修改,可是Etag每次都會改變確保了精度;若是是負載均衡的服務器,各個服務器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要遜於Last-Modified,畢竟Last-Modified只須要記錄時間,而Etag須要服務器經過算法來計算出一個hash值。
第三在優先級上,服務器校驗優先考慮Etag。
瀏覽器第一次加載資源,服務器返回200,瀏覽器將資源文件從服務器上請求下載下來,並把response header及該請求的返回時間一併緩存;
下一次加載資源時,先比較當前時間和上一次返回200時的時間差,若是沒有超過cache-control設置的max-age,則沒有過時,命中強緩存,不發請求直接從本地緩存讀取該文件(若是瀏覽器不支持HTTP1.1,則用expires判斷是否過時);若是時間過時,則向服務器發送header帶有If-None-Match和If-Modified-Since 的請求;
服務器收到請求後,優先根據Etag的值判斷被請求的文件有沒有作修改,Etag值一致則沒有修改,命中協商緩存,返回304;若是不一致則有改動,直接返回新的資源文件帶上新的Etag值並返回 200;
若是服務器收到的請求沒有Etag值,則將If-Modified-Since和被請求文件的最後修改時間作比對,一致則命中協商緩存,返回304;不一致則返回新的last-modified和文件並返回 200;
地址欄訪問,連接跳轉是正經常使用戶行爲,將會觸發瀏覽器緩存機制;
F5刷新,瀏覽器會設置max-age=0,跳過強緩存判斷,會進行協商緩存判斷;
ctrl+F5刷新,跳過強緩存和協商緩存,直接從服務器拉取資源。
說到跨域,首先就要提到一個前端的安全概念,即瀏覽器的同源策略.
簡單來講,就是瀏覽器爲了保證用戶信息的安全,防止惡意的網站竊取數據,只容許同源的js腳本操做本頁面。
那若是咱們須要在同一個頁面中請求非同源的數據怎麼辦呢?這個就涉及到跨域問題了。
同源須要同時知足如下三個條件:
注意:父域名同樣,子域名不同也是非同源的。
若是非同源,如下三種行爲將受到限制:
(1) Cookie、LocalStorage 和 IndexDB 沒法讀取。
(2) DOM 沒法得到。
(3) AJAX 請求不能發送。
這是一種最經常使用也是支持度比較高的跨域方式,其原理動態插入script
標籤,經過script
標籤引入一個js
文件,這個js文件載入成功後會執行咱們在url參數中指定的函數,而且會把咱們須要的json
數據做爲參數傳入。
優勢是兼容性好,簡單易用,支持瀏覽器與服務器雙向通訊。缺點是隻支持GET請求。
服務器端對於CORS
的支持,主要就是經過設置Access-Control-Allow-Origin
來進行的。若是瀏覽器檢測到相應的設置,就能夠容許Ajax
進行跨域的訪問。
以上兩種方式主要用來跟後臺數據交互.
將子域和主域的document.domain
設爲同一個主域.前提條件:這兩個域名必須屬於同一個基礎域名!並且所用的協議,端口都要一致,不然沒法利用document.domain
進行跨域
主域相同的使用document.domain
此方法能夠用來解決跨域cookie本地存儲的跨域訪問,LocalStorage 和 IndexDB 沒法經過這種方法,規避同源政策,而要使用下文介紹的PostMessage API。
window
對象有個name
屬性,該屬性有個特徵:即在一個窗口(window)的生命週期內,窗口載入的全部的頁面都是共享一個window.name
的,每一個頁面對window.name
都有讀寫的權限,window.name
是持久存在一個窗口載入過的全部頁面中的
以上兩種主要用在 使用`iframe來實現頁面結構的頁面.完成DOM之間的跨域交互.
window.postMessage
方法來跨域傳送數據該方法容許跨窗口通訊,不論這兩個窗口是否同源。
方法的第一個參數是具體的信息內容,第二個參數是接收消息的窗口的源(origin),即"協議 + 域名 + 端口"。也能夠設爲*,表示不限制域名,向全部窗口發送。
postMessage/addEventListener 基本相似於一個全局的事件管理器.能夠經過這兩個接口來發送/監聽 事件,從而完成信息交互.
無論怎麼觸發,都是按照指定的間隔來執行,一樣給個基本版。
請輸入代碼function throttle(func, wait) { var timer return function() { var context = this var args = arguments if (!timer) { timer = setTimeout(function () { timer = null func.apply(context, args) }, wait) } } }
無論你觸發多少次,都等到你最後觸發後過一段你指定的時間才觸發。按照這個解釋,寫一個基本版的。
function debounce(func, wait) { var timer return function() { var context = this var args = arguments clearTimeout(timer) timer = setTimeout(function() { func.apply(context, args) }, wait) } }
text-align: center;
便可實現text-align: center;
,再給子元素恢復須要的值position: relative;
,3)浮動方向偏移量(left或者right)設置爲50%,4)浮動方向上的margin設置爲元素寬度一半乘以-1font-size
的line-height
:(block formatting context),
建立規則:
float
不是none
)position
取值爲absolute
或fixed
)display
取值爲inline-block
,table-cell
, table-caption
,flex
, inline-flex
之一的元素overflow
不是visible
的元素做用:
根據css rules 與dom tree 生成render tree。瀏覽器先產生一個元素集合,這個集合每每由最後一個部分的索引產生(若是沒有索引就是全部元素的集合)。
而後向上匹配,若是不符合上一個部分,就把元素從集合中刪除,直到真個選擇器都匹配完,還在集合中的元素就匹配這個選擇器了。
舉個例子,有選擇器:
body.ready #wrapper > .lol233
先把全部 class 中有 lol233 的元素拿出來組成一個集合,而後上一層,對每個集合中的元素,若是元素的 parent id 不爲 #wrapper 則把元素從集合中刪去。 再向上,從這個元素的父元素開始向上找,沒有找到一個 tagName 爲 body 且 class 中有 ready 的元素,就把原來的元素從集合中刪去。至此這個選擇器匹配結束,全部還在集合中的元素知足。
1)效率,找元素的父親和以前的兄弟比遍歷全部兒子快並且方便。
2)關於文檔流的解析方向,是由於如今的 CSS,一個元素只要肯定了這個元素在文檔流以前出現過的全部元素,就能肯定他的匹配狀況。應用在即便 html 沒有載入完成,瀏覽器也能根據已經載入的這一部分信息徹底肯定出現過的元素的屬性。
主要也仍是效率。
基於 CSS Rule 數量遠遠小於元素數量的假設和索引的運用,遍歷每一條 CSS Rule 經過集合篩選,比遍歷每個元素再遍歷每一條 Rule 匹配要快得多。
先看下各個屬性值的定義:
一、static:默認值。沒有定位,元素出如今正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明)。
二、relative:生成相對定位的元素,經過top,bottom,left,right的設置相對於其正常位置進行定位。可經過z-index進行層次分級。
三、absolute:生成絕對定位的元素,相對於 static 定位之外的第一個父元素進行定位。元素的位置經過 "left", "top", "right" 以及 "bottom" 屬性進行規定。可經過z-index進行層次分級。
四、fixed:生成絕對定位的元素,相對於瀏覽器窗口進行定位。元素的位置經過 "left", "top", "right" 以及 "bottom" 屬性進行規定。可經過z-index進行層次分級。
static與fixed的定位方式較好理解,在此不作分析。下面對應用的較多的relative和absolute進行分析:
一、relative。定位爲relative的元素脫離正常的文本流中,但其在文本流中的位置依然存在,依然佔有原來的位置,後面的元素沒法向前補充。
二、absolute。定位爲absolute的層脫離正常文本流,但與relative的區別是其在正常流中的位置不在存在,至關於被提高到另外一個層面去了,後面的元素會補佔它的位置。
首先,是上面已經提到過的在正常流中的位置存在與否。
其次,relative定位的層老是相對於其最近的父元素,absolute定位的層老是相對於其最近的定義爲absolute或 relative的父層,而這個父層並不必定是其直接父層。若是其父層中都未定義absolute或relative,則其將相對body進行定位。
fixed:生成絕對定位的元素,相對於瀏覽器窗口進行定位。
自適應佈局(Adaptive Layout)
自適應佈局(Adaptive)的特色是分別爲不一樣的屏幕分辨率定義佈局。佈局切換時頁面元素髮生改變,但在每一個佈局中,頁面元素不隨窗口大小的調整發生變化。
就是說你看到的頁面,裏面元素的位置會變化而大小不會變化;你能夠把自適應佈局看做是靜態佈局的一個系列。
流式佈局(Liquid Layout)
流式佈局(Liquid)的特色(也叫"Fluid") 是頁面元素的寬度按照屏幕進行適配調整,主要的問題是若是屏幕尺度跨度太大,那麼在相對其原始設計而言太小或過大的屏幕上不能正常顯示。
響應式佈局(Responsive Layout)
分別爲不一樣的屏幕分辨率定義佈局,同時,在每一個佈局中,應用流式佈局的理念,即頁面元素寬度隨着窗口調整而自動適配。 能夠把響應式佈局看做是流式佈局和自適應佈局設計理念的融合。
1XX 提示信息 - 表示請求已被成功接收,繼續處理
100 (繼續) 請求者應當繼續提出請求。 服務器返回此代碼表示已收到請求的第一部分,正在等待其他部分。
101 (切換協議) 請求者已要求服務器切換協議,服務器已確認並準備切換。
2XX 成功 - 表示請求已被成功接收,理解,接受
200 (成功) 服務器已成功處理了請求。 一般,這表示服務器提供了請求的網頁。
201 (已建立) 請求成功而且服務器建立了新的資源。
3XX 重定向 - 要完成請求必須進行更進一步的處理
304 (未修改) 自從上次請求後,請求的網頁未修改過。 服務器返回此響應時,不會返回網頁內容。
4XX 客戶端錯誤 - 請求有語法錯誤或請求沒法實現
400 (錯誤請求) 服務器不理解請求的語法。
401 (未受權) 請求要求身份驗證。 對於須要登陸的網頁,服務器可能返回此響應。
403 (禁止) 服務器拒絕請求。
404 (未找到) 服務器找不到請求的網頁。
5XX 服務器端錯誤 - 服務器未能實現合法的請求
500 (服務器內部錯誤) 服務器遇到錯誤,沒法完成請求。
501 (還沒有實施) 服務器不具有完成請求的功能。 例如,服務器沒法識別請求方法時可能會返回此代碼。
502 (錯誤網關) 服務器做爲網關或代理,從上游服務器收到無效響應。
503 (服務不可用) 服務器目前沒法使用(因爲超載或停機維護)。 一般,這只是暫時狀態。
504 (網關超時) 服務器做爲網關或代理,可是沒有及時從上游服務器收到請求。
505 (HTTP 版本不受支持) 服務器不支持請求中所用的 HTTP 協議版本。
content方面
Server方面
Cookie方面
css方面
Javascript方面
圖片方面
移動方面
即將須要傳輸的內容壓縮後傳輸到客戶端再解壓,這樣在網絡上傳輸的 數據量就會大幅減少。一般在服務器上的Apache、Nginx能夠直接開啓這個設置,也能夠從代碼角度直接設置傳輸文件頭,增長gzip的設置,也能夠 從 負載均衡設備直接設置。不過須要留意的是,這個設置會略微增長服務器的負擔。建議服務器性能不是很好的網站,要慎重考慮。
CDN的全稱是Content Delivery Network,即內容分發網絡。其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快、更穩定。其目的是使用戶可就近取得所需內容,解決 Internet網絡擁擠的情況,提升用戶訪問網站的響應速度。
Ajax調用都採用緩存調用方式,通常採用附加特徵參數方式實現,注意其中的<script src=」xxx.js?{VERHASH}」,{VERHASH}就是特徵參數,這個參數不變化就使用緩存文件,若是發生變化則從新下載新文件或更新信息。
瀏覽器查看緩存,若是請求資源在緩存中而且新鮮,跳轉到轉碼步驟
檢驗新鮮一般有兩個HTTP頭進行控制Expires
和Cache-Control
:
瀏覽器獲取主機ip地址,過程以下:
打開一個socket與目標IP地址,端口創建TCP連接,三次握手以下:
瀏覽器接收HTTP響應,而後根據狀況選擇關閉TCP鏈接或者保留重用,關閉TCP鏈接的四次握手以下:
構建DOM樹:
構建CSSOM樹:
script
,meta
這樣自己不可見的標籤。2)被css隱藏的節點,如display: none
js解析以下:
web語義化是指經過HTML標記表示頁面包含的信息,包含了HTML標籤的語義化和css命名的語義化。
HTML標籤的語義化是指:經過使用包含語義的標籤(如h1-h6)恰當地表示文檔結構
css命名的語義化是指:爲html標籤添加有意義的class,id補充未表達的語義,如Microformat經過添加符合規則的class描述信息
爲何須要語義化:
模塊化是軟件系統的屬性,這個系統被分解爲一組高內聚,低耦合的模塊。
那麼在理想狀態下咱們只須要完成本身部分的核心業務邏輯代碼,其餘方面的依賴能夠經過直接加載被人已經寫好模塊進行使用便可。
首先,既然是模塊化設計,那麼做爲一個模塊化系統所必須的能力:
1. 定義封裝的模塊。 2. 定義新模塊對其餘模塊的依賴。 3. 可對其餘模塊的引入支持。
不一樣之處
二者的主要區別以下:
RequireJS 想成爲瀏覽器端的模塊加載器,同時也想成爲 Rhino / Node 等環境的模塊加載器。
Sea.js 則專一於 Web 瀏覽器端,同時經過 Node 擴展的方式能夠很方便跑在 Node 環境中。