Node.js新手必須知道的4個JavaScript概念

若是隻須要知道一種編程語言就能夠構建一個全棧的應用程序,是否是特別了不得?Ryan Dahl爲了把這個想法成爲現實,創造了node.js。Node.js是創建在Chrome強勁的V8 JavaScript引擎上的服務器端框架。雖然最初是用C++編寫的,可是應用程序經過JavaScript運行。node

這樣一來,問題就解決了。一種語言就能夠統治一切。並且,在整個應用程序中你只須要使用這一種語言。因此,咱們須要深入瞭解node.js。這就是本文的主題。編程

下面這四個基本概念是你想要掌握node.js所必需的。我會盡量長話短說向你們介紹它們。瀏覽器

1.非阻塞或異步I/O服務器

因爲Node.js是一種服務器端框架,因此它的一個主要工做就是處理瀏覽器請求。在傳統的I/O系統中,當前請求只有當先前請求的響應(HTML頁面)已到達纔會發出。這就是爲何它被稱爲阻塞I/O。服務器阻塞其餘請求是爲了處理當前的請求,而這會致使瀏覽器的等待。app

Node.js不遵循I/O的這個原則。若是一個請求須要花費較長時間,那麼Node.js會發送請求到事件循環(event loop)中,並繼續在調用棧(call stack)中處理下一個請求。一旦未決請求完成處理,它就會告訴Node.js,並將響應渲染在瀏覽器上。框架

用一個虛擬的例子來理解這一點:異步

阻塞I / O編程語言

在這個餐廳例子中,服務員給出菜單,等待訂單完成,而後再回到餐桌根據菜單上菜。在當前客戶點菜時,服務員就在旁邊等待,不接受其餘客戶的菜單。函數

非阻塞I / Ooop

在這個例子中,服務員得到菜單,並告知廚師,而後返回取另外一份菜單。在完成第一個菜單進程中,他既按照順序給當前顧客上菜,也接受來自其餘客戶的點單。服務員不會由於阻塞來自於其餘客戶的點菜而浪費時間。

2.原型

原型是JavaScript的一個複雜概念。不過由於在Node.js中你要屢次用到原型,因此每一個JavaScript開發人員都必須瞭解這個概念。

在實現經典繼承的語言中,例如Java,或C ++,對於以代碼重用爲目的的語言,你首先必須寫一個類,而後從該類建立對象或擴展該類。可是,在JavaScript中不存在類的概念。首先在JavaScript中建立一個對象,而後從這個對象中增長本身的對象,或建立新的對象。這就是所謂的原型傳承和經過原型的實現。

每一個JavaScript對象被連接到一個來自於它能夠繼承屬性的原型對象。原型相似其餘OO語言中的類,但不一樣的是,它們自己也是對象。每個對象都連接到Object.prototype,而Object.prototype自帶JavaScript預約義。

若是你經過obj.propName或 obj['propName'] 查找屬性,而對象並不具備可經過 obj.hasOwnProperty(‘propName’)被檢查的屬性,那麼JavaScript的運行時會在其原型對象中查找屬性。若是原型對象也沒有這樣的屬性,那麼依次檢查它的原型,直到找到匹配,或者到達Object.prototype。若是該屬性不存在原型鏈,那麼它會致使一個未定義的值。

經過下面的示例代碼來理解這個概念:

當你建立一個新對象的時候,你必須選擇一個應該是它的原型的對象。這裏,咱們添加了一個方法到Object function。該方法建立了一個使用另外一個對象做爲其原型的新對象,而原型做爲參數傳遞給它。

當咱們改變新對象的時候,它的原型不受影響。可是,當咱們進行改變原型對象的時候,這些變化在全部基於該原型的對象上可見。

原型是一個複雜的概念。我將在另外一篇文章中詳細說明。

3.模塊

若是你曾經接觸過Java中的包,那麼Node.js中的模塊也沒有什麼不一樣。若是沒有,那麼也不用擔憂。模塊是包含特定目的代碼的簡單的JavaScript文件。模塊模式用來使你的代碼易於導航和使用。要使用模塊屬性,你須要在JavaScript文件中需求它,很像在Java類中導入包。

node.js中有兩種類型的模塊。

核心模塊——這些模塊是用Node.js庫預編譯過的。核心模塊的目的是提供開發者常常發生和重複的代碼段,這些代碼段若是不可用的話,會致使開發者陷入不得不一次又一次地寫相同代碼的處境。一些常見的核心模塊是HTTP,URL,EVENTS,FILE SYSTEM,等等。

用戶定義模塊——用戶定義模塊是開發人員在應用程序內建立用於特定目的的模塊。當核心模塊不能知足指望功能的時候就須要用戶定義模塊。

模塊經過require函數提取。若是它是一個核心模塊,那麼參數僅僅是模塊的名稱。若是它是一個用戶自定義模塊,那麼參數就是該模塊在文件系統中的路徑。例如:

4.回調函數

在JavaScript中,函數被認爲是第一類對象。這意味着你能夠對這些函數作全部可對常規對象作的操做。你能夠賦值函數給變量,做爲參數傳遞函數給方法,做爲對象屬性聲明函數,甚至從函數返回函數。

回調函數是JavaScript中的匿名函數,它能夠做爲參數傳遞給其餘函數,要麼被執行或返回自函數稍後執行。這是回調函數——這個使用最廣的函數編程範式的基礎。

當咱們將回調函數做爲參數傳遞給另外一個函數的時候,咱們只能傳遞函數定義……換言之就是,咱們不知道這個回調函數何時會執行。這徹底取決於調用函數的機制。它會在之後的某個時間點「回調」,所以而得名。這也是非阻塞或Node.js異步行爲的惟一基礎,以下例所示。

這是回調函數最簡單的例子之一。咱們將一個匿名函數做爲一個參數傳遞,這個參數只需在控制檯上記錄一些輸出到setTimeout函數。它是惟一的函數定義,可是不知道什麼時候執行。這須要通過2秒後,經過第二個參數,調用setTimeout函數來決定。

首先,第二個日誌語句記錄輸出到控制檯,而後,2秒鐘後,回調函數中的日誌語句記錄輸出。

上面這些就是Node.js新手必須知道的4個最重要的 JavaScript概念。你的見解呢?但願你們可以暢所欲言!

相關文章
相關標籤/搜索