目錄
1.非阻塞或非同步I/O
2.原型
3.模組
4.回调函数
首頁 web前端 js教程 關於Node.js的4個JavaScript概念的詳細解

關於Node.js的4個JavaScript概念的詳細解

Mar 10, 2017 pm 02:46 PM

關於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概念的詳細解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles