Node.js 全域對象


JavaScript 中有一個特殊的對象,稱為全域物件(Global Object),它及其所有屬性都可以在程式的任何地方訪問,即全域變數。

在瀏覽器 JavaScript 中,通常 window 是全域對象, 而 Node.js 中的全域物件是 global,所有全域變數(除了 global 本身)都是 global 對象的屬性。

在 Node.js 我們可以直接存取到 global 的屬性,而不需要在應用程式中包含它。


全域物件與全域變數

global 最根本的作用是作為全域變數的宿主。依照 ECMAScript 的定義,滿足以下條 件的變數是全域變數:

  • 在最外層定義的變數;

  • 全域物件的屬性;

  • #隱含定義的變數(未定義直接賦值的變數)。

當你定義一個全域變數時,這個變數同時也會成為全域物件的屬性,反之亦然。需要注 意的是,在 Node.js 中你不可能在最外層定義變量,因為所有使用者程式碼都是屬於目前模組的, 而模組本身不是最外層上下文。

注意:永遠使用 var 定義變數以避免引入全域變量,因為全域變數會污染 命名空間,提高程式碼的耦合風險。


__filename

__filename 表示目前正在執行的腳本的檔案名稱。它將輸出檔案所在位置的絕對路徑,且和命令列參數所指定的檔案名稱不一定相同。 如果在模組中,傳回的值是模組檔案的路徑。

實例

建立文件main.js ,程式碼如下所示:

// 输出全局变量 __filename 的值
console.log( __filename );

執行main.js 文件,程式碼如下所示:

$ node main.js
/web/com/php/nodejs/main.js

__dirname

__dirname 表示目前執行腳本所在的目錄。

實例

建立文件main.js ,程式碼如下所示:

// 输出全局变量 __dirname 的值
console.log( __dirname );

執行main.js 文件,程式碼如下所示:

$ node main.js
/web/com/php/nodejs

setTimeout(cb, ms)

setTimeout(cb, ms) 全域函數在指定的毫秒(ms)數後執行指定函數(cb)。 :setTimeout() 只執行一次指定函數。

傳回一個代表定時器的句柄值。

實例

建立文件main.js ,程式碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 两秒后执行以上函数
setTimeout(printHello, 2000);

執行main.js 文件,程式碼如下所示:

$ node main.js
Hello, World!

clearTimeout(t)

clearTimeout( t ) 全域函數用來停止一個先前透過setTimeout() 建立的計時器。 參數 t 是透過 setTimeout() 函數建立的計算器。

實例

建立文件main.js ,程式碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 两秒后执行以上函数
var t = setTimeout(printHello, 2000);

// 清除定时器
clearTimeout(t);

執行main.js 文件,程式碼如下所示:

$ node main.js

setInterval(cb, ms)

setInterval(cb, ms) 全域函數在指定的毫秒(ms)數後執行指定函數(cb)。

傳回一個代表定時器的句柄值。可以使用 clearInterval(t) 函數來清除定時器。

setInterval() 方法會不停地呼叫函數,直到 clearInterval() 被呼叫或視窗關閉。

實例

建立文件 main.js ,程式碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 两秒后执行以上函数
setInterval(printHello, 2000);

執行 main.js 文件,程式碼如下所示:

$ node main.js
Hello, World! Hello, World! Hello, World! Hello, World! Hello, World! ……

以上程式每隔兩秒就會輸出一次"Hello, World!",且會永久執行下去,直到你按下 ctrl + c 按鈕。


console

console 用於提供控制台標準輸出,它是由 Internet Explorer 的 JScript 引擎提供的偵錯工具,後來逐漸成為瀏覽器的事實標準。

Node.js 沿用了這個標準,提供與習慣行為一致的 console 對象,用於向標準輸出流(stdout)或標準錯誤流(stderr)輸出字符。

console 方法

以下為console 物件的方法:

序號方法& 描述
1console.log([data][, ...])
向標準輸出流列印字元並以換行符號結束。此方法接收若干 個參數,如果只有一個參數,則輸出這個參數的字串形式。如果有多個參數,則 以類似C 語言 printf() 指令的格式輸出。
2console.info([data][, ...])
P該指令的作用是傳回訊息性訊息,這個指令與console.log差別並不大,除了在chrome中只會輸出文字外,其餘的會顯示一個藍色的驚嘆號。
3console.error([data][, ...])
輸出錯誤訊息的。控制台在出現錯誤時會顯示是紅色的叉子。
4console.warn([data][, ...])
輸出警告訊息。控制台出現有黃色的驚嘆號。
5console.dir(obj[, options])
用來對一個物件進行檢查(inspect),並以易於閱讀和列印的格式顯示。
6console.time(label)
輸出時間,表示計時開始。
7console.timeEnd(label)
結束時間,表示計時結束。
8console.trace(message[, ...])
目前執行的程式碼在堆疊中的呼叫路徑,這個測試函數運行很有幫助,只要給想測試的函數裡面加入console.trace 就行了。
9console.assert(value[, message][, ...])
用來判斷某個表達式或變數是否為真,接手兩個參數,第一個參數是表達式,第二個參數是字串。只有當第一個參數為false,才會輸出第二個參數,否則不會有任何結果。
console.log():向標準輸出流列印字元並以換行符結束。


console.log 接受若干 個參數,如果只有一個參數,則輸出這個參數的字串形式。如果有多個參數,則 以類似C 語言 printf() 指令的格式輸出。

第一個參數是一個字串,如果沒有 參數,只列印一個換行。

console.log('Hello world'); 
console.log('byvoid%diovyb'); 
console.log('byvoid%diovyb', 1991);

運行結果為:

Hello world 
byvoid%diovyb 
byvoid1991iovyb
  • console.error():與console.log() 用法相同,只是向標準錯誤流輸出。

  • console.trace():向標準錯誤流輸出目前的呼叫堆疊。

console.trace();

運行結果為:

Trace: 
at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40)

實例

建立檔案main.js ,程式碼如下所示:

console.info("程序开始执行:");

var counter = 10;
console.log("计数: %d", counter);

console.time("获取数据");
//
// 执行一些代码
// 
console.timeEnd('获取数据');

console.info("程序执行完毕。")

執行main.js 文件,程式碼如下所示:

$ node main.js
程序开始执行:
计数: 10
获取数据: 0ms
程序执行完毕

process

#process 是一個全域變量,即global 物件的屬性。

它用來描述目前Node.js 進程狀態的對象,提供了一個與作業系統的簡單介面。通常在你寫本機命令列程式的時候,少不了要 ​​和它打交道。以下將會介紹 process 物件的一些最常用的成員方法。

234

實例

建立文件main.js ,程式碼如下所示:

process.on('exit', function(code) {

  // 以下代码永远不会执行
  setTimeout(function() {
    console.log("该代码不会执行");
  }, 0);
  
  console.log('退出码为:', code);
});
console.log("程序执行结束");

執行main.js 文件,程式碼如下所示:

$ node main.js
程序执行结束
退出码为: 0

退出狀態碼

退出狀態碼如下所示:

序號#事件& 描述
1當進程準備退出時觸發。
beforeExit當 node 清空事件循環,並且沒有其他排程時觸發這個事件。通常來說,當沒有進程安排時 node 退出,但是 'beforeExit' 的監聽器可以異步調用,這樣 node 就會繼續執行。
uncaughtException當一個異常冒泡回到事件循環,觸發這個事件。如果為異常添加了監視器,預設的操作(列印堆疊追蹤資訊並退出)就不會發生。
Signal 事件當行程接收到訊號時就會觸發。訊號清單詳見標準的 POSIX 訊號名,如 SIGINT、SIGUSR1 等。
# 1245678#Invalid Argument可能是給了一個未知的參數,或是給的參數沒有值。
狀態碼#名稱& 描述


Uncaught Fatal Exception 有未捕獲異常,且沒有被網域或uncaughtException 處理函數處理。
Unused#保留
##3

#Internal JavaScript Parse ErrorJavaScript的源碼啟動Node 進程時引起解析錯誤。非常罕見,僅會在開發 Node 時才會有。
Internal JavaScript Evaluation FailureJavaScript 的原始碼啟動 Node 進程,評估時傳回函數失敗。非常罕見,僅會在開發 Node 時才會有。
Fatal ErrorV8 裡致命的不可恢復的錯誤。通常會印到stderr ,內容為: FATAL ERROR
Non-function Internal Exception Handler# 未捕獲異常,內部異常處理函數不知為何設定為on-function,並且不能被呼叫。
Internal Exception Handler Run-Time Failure 未捕獲的例外, 且異常處理函數處理時自己拋出了異常。例如,如果 process.on('uncaughtException') 或 domain.on('error') 拋出了異常。
Unused#保留
##9

#########10#########Internal JavaScript Run-Time Failure######JavaScript的原始碼啟動Node 進程時拋出錯誤,非常罕見,只會在開發Node 時才會有。 ############12#########Invalid Debug Argument### ###設定了參數--debug 和/或--debug-brk,但選擇了錯誤端口。 ############>128#########Signal Exits###### 如果Node 接收到致命訊號,例如SIGKILL 或SIGHUP,那麼退出程式碼就是128 加信號代碼。這是標準的 Unix 做法,退出訊號代碼放在高位。 ############

Process 屬性

Process 提供了許多有用的屬性,以便於我們更好的控制系統的交互作用:

##序號.屬性& 描述12345678910111213141516

實例

建立文件main.js ,程式碼如下所示:

// 输出到终端
process.stdout.write("Hello World!" + "\n");

// 通过参数读取
process.argv.forEach(function(val, index, array) {
   console.log(index + ': ' + val);
});

// 获取执行路局
console.log(process.execPath);


// 平台信息
console.log(process.platform);

執行main.js 文件,程式碼如下所示:

$ node main.js
Hello World!
0: node
1: /web/www/node/main.js
/usr/local/node/0.10.36/bin/node
darwin

方法參考手冊

Process 提供了許多有用的方法,以便於我們更好的控制系統的互動:

stdout標準輸出流。
stderr標準錯誤流。
stdin標準輸入流。
argvargv 屬性傳回一個數組,由命令列執行腳本時的各個參數組成。它的第一個成員總是node,第二個成員是腳本檔案名,其餘成員是腳本檔案的參數。
execPath返回執行目前腳本的 Node 二進位檔案的絕對路徑。
execArgv#返回一個數組,當成員是命令列下執行腳本時,在Node可執行檔與腳本文件之間的命令列參數。
env傳回一個對象,成員為目前shell 的環境變數
exitCode進程退出時的程式碼,如果進程優透過process.exit() 退出,不需要指定退出碼。
versionNode 的版本,例如v0.10.18。
versions一個屬性,包含了node 的版本和依賴.
config一個包含用來編譯目前node 執行檔的javascript 設定選項的物件。它與執行 ./configure 腳本產生的 "config.gypi" 檔案相同。
pid目前行程的行程編號。
title進程名,預設值為"node",可以自訂該值。
arch目前 CPU 的架構:'arm'、'ia32' 或 'x64'。
platform#執行程式所在的平台系統'darwin', 'freebsd', 'linux', 'sunos'或'win32'
mainModulerequire.main 的替代方法。不同點,如果主模組在運行時改變,require.main可能會繼續回傳舊的模組。可以認為,這兩者引用了同一個模組。
##4 5678910111213
序號方法& 描述
#1abort()
這將導致node 觸發abort 事件。會讓 node 退出並產生一個核心檔案。
2chdir(directory)
改變目前工作進程的目錄,如果操作失敗拋出例外。
3cwd()
#傳回目前行程的工作目錄
exit([code])使用指定的code 來結束進程。如果忽略,將會使用 code 0。
getgid()# 取得流程的群組識別(請參閱 getgid(2))。取得到得時群組的數字 id,而不是名字。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
setgid(id)設定流程的群組識別(請參閱 setgid(2))。可以接收數位 ID 或群組名。如果指定了群組名,會阻塞等待解析為數字 ID 。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
getuid()# 取得流程的使用者識別碼(參見 getuid(2))。這是數字的用戶 id,不是用戶名。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
setuid(id)#設定流程的使用者識別碼(請參閱setuid(2))。接收數字 ID或字串名字。果實指定了群組名,會阻塞等待解析為數字 ID 。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
getgroups()#傳回進程的群組 iD 陣列。 POSIX 系統沒有保證一定有,但 node.js 保證有。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
setgroups(groups)設定進程的群組 ID。這是授權操作,所有你需要有 root 權限,或有 CAP_SETGID 能力。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
initgroups(user, extra_group)讀取/etc/group ,並初始化群組存取列表,使用成員所在的所有群組。這是授權操作,所有你需要有 root 權限,或有 CAP_SETGID 能力。
注意:這個函數只在 POSIX 平台上可用(例如,非Windows 和 Android)。
kill(pid[, signal])傳送訊號給行程. pid 是行程id,且signal 是傳送的信號的字串描述。訊號名是字串,例如 'SIGINT' 或 'SIGHUP'。如果忽略,訊號會是 'SIGTERM'。
memoryUsage()傳回一個對象,描述了 Node 進程所用的記憶體狀況,單位為位元組。
14nextTick(callback)
一旦目前事件循環結束,呼叫回到函數。
15umask([mask])
設定或讀取進程檔案的遮罩。子進程從父進程繼承遮罩。如果mask 參數有效,則傳回舊的遮罩。否則,返回當前掩碼。
16uptime()
#傳回 Node 已經執行的秒數。
17hrtime()
#傳回目前程序的高分辨時間,形式​​為 [seconds, nanoseconds]陣列。它是相對於過去的任意事件。該值與日期無關,因此不受時鐘漂移的影響。主要用途是可以透過精確的時間間隔,來衡量程式的效能。
你可以將先前的結果傳遞給目前的 process.hrtime() ,會傳回兩者間的時間差,用來基準和測量時間間隔。

實例

建立文件main.js ,程式碼如下所示:

// 输出当前目录
console.log('当前目录: ' + process.cwd());

// 输出当前版本
console.log('当前版本: ' + process.version);

// 输出内存使用情况
console.log(process.memoryUsage());

執行main.js 文件,程式碼如下所示:

$ node main.js
当前目录: /web/com/php/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }