Node.js新手必須知道的4個JavaScript概念
本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃!
如果只需要知道一種程式語言就可以構建一個全棧的應用程式,是不是特別了不起?Ryan Dahl為了把這個想法成為現實,創造了node.js。Node.js是建立在Chrome強勁的V8 JavaScript引擎上的伺服器端框架。雖然最初是用C++編寫的,但是應用程式通過JavaScript執行。
這樣一來,問題就解決了。一種語言就可以統治一切。而且,在整個應用程式中你只需要使用這一種語言。所以,我們需要深刻了解node.js。這就是本文的主題。
下面這四個基本概念是你想要掌握node.js所必需的。我會盡可能長話短說向大家介紹它們。
1.非阻塞或非同步I/O
由於Node.js是一種伺服器端框架,所以它的一個主要工作就是處理瀏覽器請求。在傳統的I/O系統中,當前請求只有當先前請求的響應(HTML頁面)已到達才會發出。這就是為什麼它被稱為阻塞I/O。伺服器阻塞其他請求是為了處理當前的請求,而這會導致瀏覽器的等待。
Node.js不遵循I/O的這個原則。如果一個請求需要花費較長時間,那麼Node.js會傳送請求到事件迴圈(event loop)中,並繼續在呼叫棧(call stack)中處理下一個請求。一旦未決請求完成處理,它就會告訴Node.js,並將響應渲染在瀏覽器上。
用一個虛擬的例子來理解這一點:
阻塞I / O
// take order for table 1 and wait... var order1 = orderBlocking(['Coke', 'Iced Tea']); // once order is ready, take order back to table. serveOrder(order1); // once order is delivered, move on to another table. // take order for table 2 and wait... var order2 = orderBlocking(['Coke', 'Water']); // once order is ready, take order back to table. serveOrder(order2); // once order is delivered, move on to another table. // take order for table 3 and wait... var order3 = orderBlocking(['Iced Tea', 'Water']); // once order is ready, take order back to table. serveOrder(order3); // once order is delivered, move on to another table.
在這個餐廳例子中,服務員給出選單,等待訂單完成,然後再回到餐桌根據選單上菜。在當前客戶點菜時,服務員就在旁邊等待,不接受其他客戶的選單。
非阻塞I / O
// take order for table 1 and move on... orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){ return serveOrder(drinks); }); // take order for table 2 and move on... orderNonBlocking(['Beer', 'Whiskey'], function(drinks){ return serveOrder(drinks); }); // take order for table 3 and move on... orderNonBlocking(['Hamburger', 'Pizza'], function(food){ return serveOrder(food); });
在這個例子中,服務員獲得選單,並告知廚師,然後返回取另一份選單。在完成第一個選單程式中,他既按照順序給當前顧客上菜,也接受來自其他客戶的點單。服務員不會因為阻塞來自於其他客戶的點菜而浪費時間。
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。如果該屬性不存在原型鏈,那麼它會導致一個未定義的值。
通過下面的示例程式碼來理解這個概念:
if (typeof Object.create !== 'function') { Object.create = function (o) { var F = function () {}; F.prototype = o; return new F(); }; var otherPerson = Object.create(person);
當你建立一個新物件的時候,你必須選擇一個應該是它的原型的物件。這裡,我們新增了一個方法到Object function。該方法建立了一個使用另一個物件作為其原型的新物件,而原型作為引數傳遞給它。
當我們改變新物件的時候,它的原型不受影響。但是,當我們進行改變原型物件的時候,這些變化在所有基於該原型的物件上可見。
原型是一個複雜的概念。我將在另一篇文章中詳細說明。
3.模組
如果你曾經接觸過Java中的包,那麼Node.js中的模組也沒有什麼不同。如果沒有,那麼也不用擔心。模組是包含特定目的程式碼的簡單的JavaScript檔案。模組模式用來使你的程式碼易於導航和使用。要使用模組屬性,你需要在JavaScript檔案中需求它,很像在Java類中匯入包。
node.js中有兩種型別的模組。
核心模組——這些模組是用Node.js庫預編譯過的。核心模組的目的是提供開發者經常發生和重複的程式碼段,這些程式碼段如果不可用的話,會導致開發者陷入不得不一次又一次地寫相同程式碼的處境。一些常見的核心模組是HTTP,URL,EVENTS,FILE SYSTEM,等等。
使用者定義模組——使用者定義模組是開發人員在應用程式內建立用於特定目的的模組。當核心模組不能滿足期望功能的時候就需要使用者定義模組。
模組通過require函式提取。如果它是一個核心模組,那麼引數僅僅是模組的名稱。如果它是一個使用者自定義模組,那麼引數就是該模組在檔案系統中的路徑。例如:
// extract a core module like this var http = require('http); // extract a user defined module like this var something = require('./folder1/folder2/folder3/something.js');
4.回撥函式
在JavaScript中,函式被認為是第一類物件。這意味著你可以對這些函式做所有可對常規物件做的操作。你可以賦值函式給變數,作為引數傳遞函式給方法,作為物件屬性宣告函式,甚至從函式返回函式。
回撥函式是JavaScript中的匿名函式,它可以作為引數傳遞給其他函式,要麼被執行或返回自函式稍後執行。這是回撥函式——這個使用最廣的函式程式設計正規化的基礎。
當我們將回撥函式作為引數傳遞給另一個函式的時候,我們只能傳遞函式定義……換言之就是,我們不知道這個回撥函式什麼時候會執行。這完全取決於呼叫函式的機制。它會在以後的某個時間點“回撥”,因此而得名。這也是非阻塞或Node.js非同步行為的唯一基礎,如下例所示。
setTimeout(function() { console.log("world"); }, 2000) console.log("hello");
這是回撥函式最簡單的例子之一。我們將一個匿名函式作為一個引數傳遞,這個引數只需在控制檯上記錄一些輸出到setTimeout函式。它是唯一的函式定義,但是不知道何時執行。這需要經過2秒後,通過第二個引數,呼叫setTimeout函式來決定。
首先,第二個日誌語句記錄輸出到控制檯,然後,2秒鐘後,回撥函式中的日誌語句記錄輸出。
// output hello world
上面這些就是Node.js新手必須知道的4個最重要的 JavaScript概念。你的看法呢?希望大家能夠暢所欲言!
譯文連結:http://www.codeceo.com/article/nodejs-4-javascript-concepts.html
英文原文:Top 4 JavaScript Concepts a Node.js Beginner Must Know
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- JavaScript 面試必須知道的 10 個概念JavaScript面試
- Java新手入門必須知道的30個基本概念Java
- Spring整合RabbitMQ-必須知道的幾個概念SpringMQ
- 你必須知道的HTTP基本概念HTTP
- 高效Android開發者必須知道的4個工具Android
- 新手入門:入手MacBook 後必須知道的 幾 個小技巧?Mac
- 學習jQuery之旅--新手必須知道的常用方法jQuery
- 【網路安全】你必須知道的幾個網路安全概念
- 看Lucene原始碼必須知道的基本概念原始碼
- Node.js開發者必須瞭解的4個JS要點Node.js
- 入門node.js你必須知道的那些事Node.js
- 必須知道的JavaScript庫 - 視覺化庫JavaScript視覺化
- 15個必須知道的chrome開發者技巧Chrome
- Vue開發必須知道的36個技巧Vue
- 29 個你必須知道的 Linux 命令Linux
- Python你必須知道的十個庫Python
- 你必須知道的 SmartSql !SQL
- 轉:學習TSM必須理解的幾個概念
- 理解大型分散式網站你必須知道這些概念分散式網站
- 必須知道的28個HTML5特性、技巧HTML
- 15 個必須知道的 Chrome 開發工具技巧Chrome
- LLM部署,你必須要知道的幾個技巧!
- Linux新手大禮包:學習Linux你必須知道的那些事兒Linux
- 《Offer一籮筐》求職之前你必須知道的 4 件事!!求職
- 這幾個python常用的庫你必須知道!Python
- JS高階之面試必須知道的幾個點JS面試
- 29個網路營銷必須知道的資料
- 學習前端你必須知道的JavaScript 基礎和HTML DOM前端JavaScriptHTML
- CSS中那些必須掌握的概念CSS
- ?你必須知道的Java泛型Java泛型
- 前端必須知道的除錯工具前端除錯
- 每個開發者都應該知道的33個JavaScript概念JavaScript
- Python 這10個字典操作你必須知道Python
- Vue原始碼閱讀前必須知道javascript的基礎內容Vue原始碼JavaScript
- 檔案管理,你必須要知道的三個要點
- Python入門必須知道的11個知識點Python
- AppStore 中5個必須知道的基本設定APP
- 邊緣計算你必須知道的100個術語