在JavaScript中全局變量的做用域比較簡單,它的做用域是全局的,在代碼的任何地方都是有定義的。然而函數的參數和局部變量只在函數體內有定義。另外局部變量的優先級要高於同名的全局變量,也就是說當局部變量與全局變量重名時,局部變量會覆蓋全局變量。
在JavaScript中變量的做用域,並不是和C、Java等編程語言似得,在變量聲明的代碼段以外是不可見的,咱們一般稱爲塊級做用域,然而在JavaScript中使用的是函數做用域 變量在聲明它們的函數體以及這個函數體嵌套的任意函數體都是有定義的。
在JavaScript中,函數也是對象,實際上,JavaScript裏一切都是對象。函數對象和其它對象同樣,擁有能夠經過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],該內部屬性包含了函數被建立的做用域中對象的集合,這個集合被稱爲函數的做用域鏈,它決定了哪些數據能被函數訪問。
當一個函數建立後,它實際上保存一個做用域鏈,而且做用域鏈會被建立此函數的做用域中可訪問的數據對象填充。
function func() {
var num = 1;
alert(num);
}
func()
在函數func建立時,它的做用域鏈中會填入一個全局對象,該全局對象包含了全部全局變量
函數add的做用域將會在執行時用到。例如執行以下代碼:
執行此函數時會建立一個稱爲「運行期上下文(execution context)」(有人稱爲運行環境)的內部對象,運行期上下文定義了函數執行時的環境。每一個運行期上下文都有本身的做用域鏈,用於標識符解析,當運行期上下文被建立時,而它的做用域鏈初始化爲當前運行函數的[[Scope]]所包含的對象。
這些值按照它們出如今函數中的順序被複制到運行期上下文的做用域鏈中。它們共同組成了一個新的對象,叫「活動對象(activation object)」,該對象包含了函數的全部局部變量、命名參數、參數集合以及this,而後此對象會被推入做用域鏈的前端,當運行期上下文被銷燬,活動對象也隨之銷燬。新的做用域鏈以下圖所示:
**原型鏈**
每一個構造函數都有一個原型對象, 原型對象都包含一個指向構造函數想指針(constructor),而實例對象都包含一個指向原型對象的內部指針(proto)。若是讓原型對象等於另外一個類型的實例,此時的原型對象將包含一個指向另外一個原型的指針(proto),另外一個原型也包含着一個指向另外一個構造函數的指針(constructor)。
加入另外一個原型又是另外一個類型的實例 這就構成了實例與原型的鏈條。
function animal(){
this.type = "animal";
}
animal.prototype.getType = function(){
return this.type;
}
function dog(){
this.name = "dog";
}
dog.prototype = new animal();
dog.prototype.getName = function(){
return this.name;
}
var xiaohuang = new dog();
原型鏈關係
xiaohuang.__proto__ === dog.prototype
dog.prototype.__proto__ === animal.prototype
animal.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
MVC
全名是Model View Controller,
是模型(model)-視圖(view)-控制器(controller)的縮寫,
一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。
MVC要實現的目標是將軟件用戶界面和業務邏輯分離以使代碼可擴展性、可複用性、可維護性、靈活性增強。
好比:有一個View會提交數據給Model進行處理以實現具體的行爲,View一般不會直接提交數據給Model,它會先把數據提交給Controller,而後Controller再將數據轉發給Model。假如此時程序業務邏輯的處理方式有變化,那麼只須要在Controller中將原來的Model換成新實現的Model就能夠了,控制器的做用就是這麼簡單, 用來將不一樣的View和不一樣的Model組織在一塊兒,順便替雙方傳遞消息,僅此而已。
組成MVC的三個模式分別是組合模式、策咯模式、觀察者模式,MVC在軟件開發中發揮的威力,最終離不開這三個模式的默契配合。
View層,單獨實現了組合模式
Model層和View層,實現了觀察者模式
View層和Controller層,實現了策咯模式
MVC就是將這三個設計模式在一塊兒用了。
線程:
單線程就是按照從上向下的執行順序
單線程就意味着,全部任務須要排隊,前一個任務結束,纔會執行後一個任務。若是前一個任務耗時很長,後一個任務就不得不一直等着。
若是排隊是由於計算量大,CPU忙不過來,倒也算了,可是不少時候CPU是閒着的,由於IO設備(輸入輸出設備)很慢(好比Ajax操做從網絡讀取數據),不得不等着結果出來,再往下執行。
JavaScript語言的設計者意識到,這時主線程徹底能夠無論IO設備,掛起處於等待中的任務,先運行排在後面的任務。等到IO設備返回告終果,再回過頭,把掛起的任務繼續執行下去。
因而,全部任務能夠分紅兩種,一種是同步任務(synchronous),另外一種是異步任務(asynchronous)。同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;異步任務指的是,不進入主線程、而進入」任務隊列」(task queue)的任務,只有」任務隊列」通知主線程,某個異步任務能夠執行了,該任務纔會進入主線程執行。
下面是異步的運行機制
(1)全部同步任務都在主線程上執行,造成一個執行棧(execution context stack)。
(2)主線程以外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。
(3)一旦"執行棧"中的全部同步任務執行完畢,系統就會讀取"任務隊列",看看裏面有哪些事件。那些對應的異步任務,因而結束等待狀態,進入執行棧,開始執行。
(4)主線程不斷重複上面的第三步
只要主線空了,就會去讀取「任務隊列」 , 這就是javaScript的運行機制,這個過程不會重複。
事件和回調函數
「任務隊列」是一個事件的隊列(也能夠理解成消息的隊列),IO設備完成一項任務,就在」任務隊列」中添加一個事件,表示相關的異步任務能夠進入」執行棧」了。主線程讀取」任務隊列」,就是讀取裏面有哪些事件。
「任務隊列」中的事件,除了IO設備的事件之外,還包括一些用戶產生的事件(好比鼠標點擊、頁面滾動等等)。只要指定過回調函數,這些事件發生時就會進入」任務隊列」,等待主線程讀取。
所謂」回調函數」(callback),就是那些會被主線程掛起來的代碼。異步任務必須指定回調函數,當主線程開始執行異步任務,就是執行對應的回調函數。
「任務隊列」是一個先進先出的數據結構,排在前面的事件,優先被主線程讀取。主線程的讀取過程基本上是自動的,只要執行棧一清空,」任務隊列」上第一位的事件就自動進入主線程。可是,因爲存在後文提到的」定時器」功能,主線程首先要檢查一下執行時間,某些事件只有到了規定的時間,才能返回主線程。
Event Loop
主線程從」任務隊列」中讀取事件,這個過程是循環不斷的,因此整個的這種運行機制又稱爲Event Loop(事件循環)。
TCP / IP / HttP
TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。關於TCP/IP和HTTP協議的關係,網絡有一段比較容易理解的介紹:「咱們在傳輸數據時,能夠只使用(傳輸層)TCP/IP協議,可是那樣的話,若是沒有應用層,便沒法識別數據內容,若是想要使傳輸的數據有意義,則必須使用到應用層協議,應用層協議有不少,好比HTTP、FTP、TELNET等,也能夠本身定義應用層協議。WEB使用HTTP協議做應用層協議,以封裝HTTP 文本信息,而後使用TCP/IP作傳輸層協議將它發到網絡上。」
術語TCP/IP表明傳輸控制協議/網際協議,指的是一系列協議。「IP」表明網際協議,TCP和UDP使用該協議從一個網絡傳送數據包到另外一個網絡。把
IP想像成一種高速公路,它容許其它協議在上面行駛並找到到其它電腦的出口。
TCP和UDP是高速公路上的「卡車」,它們攜帶的貨物就是像HTTP,文件傳輸協議FTP這樣的協議等。
你應該能理解,TCP和UDP是FTP,HTTP和SMTP之類使用的傳輸層協議。雖然TCP和UDP都是用來傳輸其餘協議的,它們卻有一個顯著的不一樣:TCP提供有保證的數據傳輸,而UDP不提供。這意味着TCP有一個特殊的機制來確保數據安全的不出錯的從一個端點傳到另外一個端點,而UDP不提供任何這樣的保證。
HTTP(超文本傳輸協議)是利用TCP在兩臺電腦(一般是Web服務器和客戶端)之間傳輸信息的協議。客戶端使用Web瀏覽器發起HTTP請求給Web服務器,Web服務器發送被請求的信息給客戶端。
(收集到的圖表): 顯示不一樣的TCP/IP和其餘的協議在最初OSI模型中的位置:
一、HTTP協議的幾個重要概念
1.鏈接(Connection):一個傳輸層的實際環流,它是創建在兩個相互通信的應用程序之間。
2.消息(Message):HTTP通信的基本單位,包括一個結構化的八元組序列並經過鏈接傳輸。
3.請求(Request):一個從客戶端到服務器的請求信息包括應用於資源的方法、資源的標識符和協議的版本號
4.響應(Response):一個從服務器返回的信息包括HTTP協議的版本號、請求的狀態(例如「成功」或「沒找到」)和文檔的MIME類型。
5.資源(Resource):由URI標識的網絡數據對象或服務。
6.實體(Entity):數據資源或來自服務資源的回映的一種特殊表示方法,它可能被包圍在一個請求或響應信息中。一個實體包括實體頭信息和實體的自己內容。
7.客戶機(Client):一個爲發送請求目的而創建鏈接的應用程序。
8.用戶代理(Useragent):初始化一個請求的客戶機。它們是瀏覽器、編輯器或其它用戶工具。
9.服務器(Server):一個接受鏈接並對請求返回信息的應用程序。
10.源服務器(Originserver):是一個給定資源能夠在其上駐留或被建立的服務器。
11.代理(Proxy):一箇中間程序,它能夠充當一個服務器,也能夠充當一個客戶機,爲其它客戶機創建請求。請求是經過可能的翻譯在內部或通過傳遞到其它的服務器中。一個代理在發送請求信息以前,必須解釋而且若是可能重寫它。
代理常常做爲經過防火牆的客戶機端的門戶,代理還能夠做爲一個幫助應用來經過協議處理沒有被用戶代理完成的請求。
12.網關(Gateway):一個做爲其它服務器中間媒介的服務器。與代理不一樣的是,網關接受請求就好象對被請求的資源來講它就是源服務器;發出請求的客戶機並無意識到它在同網關打交道。
網關常常做爲經過防火牆的服務器端的門戶,網關還能夠做爲一個協議翻譯器以便存取那些存儲在非HTTP系統中的資源。
13.通道(Tunnel):是做爲兩個鏈接中繼的中介程序。一旦激活,通道便被認爲不屬於HTTP通信,儘管通道多是被一個HTTP請求初始化的。當被中繼的鏈接兩端關閉時,通道便消失。當一個門戶(Portal)必須存在或中介(Intermediary)不能解釋中繼的通信時通道被常用。
14.緩存(Cache):反應信息的局域存儲。
2.發送請求
打開一個鏈接後,客戶機把請求消息送到服務器的停留端口上,完成提出請求動做。
HTTP/1.0 請求消息的格式爲:
請求消息=請求行(通用信息|請求頭|實體頭)CRLF[實體內容]
請求 行=方法 請求URL HTTP版本號 CRLF
方 法=GET|HEAD|POST|擴展方法
U R L=協議名稱+宿主名+目錄與文件名
請求行中的方法描述指定資源中應該執行的動做,經常使用的方法有GET、HEAD和POST。不一樣的請求對象對應GET的結果是不一樣的,對應關係以下:
對象 GET的結果
文件 文件的內容
程序 該程序的執行結果
數據庫查詢 查詢結果
HEAD??要求服務器查找某對象的元信息,而不是對象自己。
POST??從客戶機向服務器傳送數據,在要求服務器和CGI作進一步處理時會用到POST方法。POST主要用於發送HTML文本中FORM的內容,讓CGI程序處理。
一個請求的例子爲:
GEThttp://networking.zju.edu.cn/zju/index.htmHTTP/1.0 networking.zju.edu.cn/zju/index.htmHTTP/1.0 頭信息又稱爲元信息,即信息的信息,利用元信息能夠實現有條件的請求或應答。
請求頭??告訴服務器怎樣解釋本次請求,主要包括用戶能夠接受的數據類型、壓縮方法和語言等。
實體頭??實體信息類型、長度、壓縮方法、最後一次修改時間、數據有效期等。
實體??請求或應答對象自己。
3.發送響應
服務器在處理完客戶的請求以後,要向客戶機發送響應消息。
HTTP/1.0的響應消息格式以下:
響應消息=狀態行(通用信息頭|響應頭|實體頭) CRLF 〔實體內容〕
狀態行=HTTP版本號 狀態碼 緣由敘述
狀態碼錶示響應類型
1×× 保留
2×× 表示請求成功地接收
3×× 爲完成請求客戶需進一步細化請求
4×× 客戶錯誤
5×× 服務器錯誤
響應頭的信息包括:服務程序名,通知客戶請求的URL須要認證,請求的資源什麼時候能使用。
4.關閉鏈接
客戶和服務器雙方均可以經過關閉套接字來結束TCP/IP對話
https://github.com/White9999