什么是node.js
Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運(yùn)行環(huán)境涂炎。
Node.js 使用了一個事件驅(qū)動愕够、非阻塞式 I/O的模型果漾,使其輕量又高效壳猜。
NodeJS就是一個解析器,node的環(huán)境和瀏覽器的環(huán)境不同氓癌,是沒有BOM和DOM對象的谓谦,不過運(yùn)行在NodeJS中的JS的用途是操作磁盤文件或搭建HTTP服務(wù)器,NodeJS相應(yīng)提供了fs贪婉、http等內(nèi)置對象
Node.js的安裝
可以在nodejs.org這里找到對應(yīng)的系統(tǒng)和版本下載并安裝
在安裝Node.js時也會相應(yīng)的安裝npm反粥,npm是node的包管理工具,通過npm可以用命令行快速的下載所需要的node模塊疲迂。
異步操作
Node采用V8引擎處理JavaScript腳本才顿,最大特點(diǎn)就是單線程運(yùn)行,一次只能運(yùn)行一個任務(wù)尤蒿。這導(dǎo)致Node大量采用異步操作(asynchronous operation)郑气,即任務(wù)不是馬上執(zhí)行,而是插在任務(wù)隊(duì)列的尾部腰池,等到前面的任務(wù)運(yùn)行完后再執(zhí)行尾组。
由于這種特性,某一個任務(wù)的后續(xù)操作示弓,往往采用回調(diào)函數(shù)(callback)的形式進(jìn)行定義讳侨。
Node約定,如果某個函數(shù)需要回調(diào)函數(shù)作為參數(shù)避乏,則回調(diào)函數(shù)是最后一個參數(shù)爷耀。另外,回調(diào)函數(shù)本身的第一個參數(shù)拍皮,約定為上一步傳入的錯誤對象。
回調(diào)函數(shù)的第一個參數(shù)是Error對象跑杭,第二個參數(shù)才是真正的數(shù)據(jù)參數(shù)铆帽,因?yàn)榛卣{(diào)函數(shù)主要用于異步操作,當(dāng)回調(diào)函數(shù)運(yùn)行時德谅,前期的操作早結(jié)束了爹橱,錯誤的執(zhí)行棧早就不存在了,傳統(tǒng)的錯誤捕捉機(jī)制try…catch對于異步操作行不通窄做,所以只能把錯誤交給回調(diào)函數(shù)處理愧驱。
Node統(tǒng)一規(guī)定,一旦異步操作發(fā)生錯誤椭盏,就把錯誤對象傳遞到回調(diào)函數(shù)组砚。
全局對象和全局變量
Node提供以下幾個全局對象,它們是所有模塊都可以調(diào)用的掏颊。
global:表示Node所在的全局環(huán)境糟红,類似于瀏覽器的window對象艾帐。需要注意的是,如果在瀏覽器中聲明一個全局變量盆偿,實(shí)際上是聲明了一個全局對象的屬性柒爸,比如var x = 1等同于設(shè)置window.x = 1,但是Node不是這樣事扭,至少在模塊中不是這樣(REPL環(huán)境的行為與瀏覽器一致)捎稚。在模塊文件中,聲明var x = 1求橄,該變量不是global對象的屬性阳藻,global.x等于undefined。這是因?yàn)槟K的全局變量都是該模塊私有的谈撒,其他模塊無法取到腥泥。
process:該對象表示Node所處的當(dāng)前進(jìn)程,允許開發(fā)者與該進(jìn)程互動啃匿。
console:指向Node內(nèi)置的console模塊蛔外,提供命令行環(huán)境中的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出功能溯乒。
Node還提供一些全局函數(shù)夹厌。
setTimeout():用于在指定毫秒之后,運(yùn)行回調(diào)函數(shù)裆悄。實(shí)際的調(diào)用間隔矛纹,還取決于系統(tǒng)因素。間隔的毫秒數(shù)在1毫秒到2,147,483,647毫秒(約24.8天)之間光稼。如果超過這個范圍或南,會被自動改為1毫秒。該方法返回一個整數(shù)艾君,代表這個新建定時器的編號采够。
clearTimeout():用于終止一個setTimeout方法新建的定時器。
setInterval():用于每隔一定毫秒調(diào)用回調(diào)函數(shù)冰垄。由于系統(tǒng)因素蹬癌,可能無法保證每次調(diào)用之間正好間隔指定的毫秒數(shù),但只會多于這個間隔虹茶,而不會少于它逝薪。指定的毫秒數(shù)必須是1到2,147,483,647(大約24.8天)之間的整數(shù),如果超過這個范圍蝴罪,會被自動改為1毫秒董济。該方法返回一個整數(shù),代表這個新建定時器的編號洲炊。
clearInterval():終止一個用setInterval方法新建的定時器感局。
require():用于加載模塊尼啡。
Buffer():用于操作二進(jìn)制數(shù)據(jù)。
Node提供兩個全局變量询微,都以兩個下劃線開頭崖瞭。
__filename:指向當(dāng)前運(yùn)行的腳本文件名。
__dirname:指向當(dāng)前運(yùn)行的腳本所在的目錄撑毛。
除此之外书聚,還有一些對象實(shí)際上是模塊內(nèi)部的局部變量,指向的對象根據(jù)模塊不同而不同藻雌,但是所有模塊都適用雌续,可以看作是偽全局變量,主要為module, module.exports, exports等胯杭。