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/runoob/nodejs/main.js
__dirname
__dirname 表示當前執行腳本所在的目錄。
實例
創建文件 main.js ,代碼如下所示:
// 輸出全局變量 __dirname 的值
console.log( __dirname );
執行 main.js 文件,代碼如下所示:
$ node main.js
/web/com/runoob/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 對象的方法:
序號 | 方法 & 描述 |
---|---|
1 |
console.log([data][, ...]) 向標準輸出流打印字符並以換行符結束。該方法接收若干 個參數,如果只有一個參數,則輸出這個參數的字符串形式。如果有多個參數,則 以類似於C 語言 printf() 命令的格式輸出。 |
2 |
console.info([data][, ...]) P該命令的作用是返回信息性消息,這個命令與console.log差別並不大,除了在chrome中只會輸出文字外,其餘的會顯示一個藍色的驚歎號。 |
3 |
console.error([data][, ...]) 輸出錯誤消息的。控制檯在出現錯誤時會顯示是紅色的叉子。 |
4 |
console.warn([data][, ...]) 輸出警告消息。控制檯出現有黃色的驚歎號。 |
5 |
console.dir(obj[, options]) 用來對一個對象進行檢查(inspect),並以易於閱讀和打印的格式顯示。 |
6 |
console.time(label) 輸出時間,表示計時開始。 |
7 |
console.timeEnd(label) 結束時間,表示計時結束。 |
8 |
console.trace(message[, ...]) 當前執行的代碼在堆棧中的調用路徑,這個測試函數運行很有幫助,只要給想測試的函數裏面加入 console.trace 就行了。 |
9 |
console.assert(value[, message][, ...]) 用於判斷某個表達式或變量是否爲真,接手兩個參數,第一個參數是表達式,第二個參數是字符串。只有當第一個參數爲false,纔會輸出第二個參數,否則不會有任何結果。 |
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 對象的一些最常用的成員方法。
序號 | 事件 & 描述 |
---|---|
1 |
exit 當進程準備退出時觸發。 |
2 |
beforeExit 當 node 清空事件循環,並且沒有其他安排時觸發這個事件。通常來說,當沒有進程安排時 node 退出,但是 'beforeExit' 的監聽器可以異步調用,這樣 node 就會繼續執行。 |
3 |
uncaughtException 當一個異常冒泡回到事件循環,觸發這個事件。如果給異常添加了監視器,默認的操作(打印堆棧跟蹤信息並退出)就不會發生。 |
4 |
Signal 事件 當進程接收到信號時就觸發。信號列表詳見標準的 POSIX 信號名,如 SIGINT、SIGUSR1 等。 |
實例
創建文件 main.js ,代碼如下所示:
process.on('exit', function(code) {
// 以下代碼永遠不會執行
setTimeout(function() {
console.log("該代碼不會執行");
}, 0);
console.log('退出碼爲:', code);
});
console.log("程序執行結束");
執行 main.js 文件,代碼如下所示:
$ node main.js
程序執行結束
退出碼爲: 0
退出狀態碼
退出狀態碼如下所示:
狀態碼 | 名稱 & 描述 |
---|---|
1 |
Uncaught Fatal Exception 有未捕獲異常,並且沒有被域或 uncaughtException 處理函數處理。 |
2 |
Unused 保留 |
3 |
Internal JavaScript Parse Error JavaScript的源碼啓動 Node 進程時引起解析錯誤。非常罕見,僅會在開發 Node 時纔會有。 |
4 |
Internal JavaScript Evaluation Failure JavaScript 的源碼啓動 Node 進程,評估時返回函數失敗。非常罕見,僅會在開發 Node 時纔會有。 |
5 |
Fatal Error V8 裏致命的不可恢復的錯誤。通常會打印到 stderr ,內容爲: FATAL ERROR |
6 |
Non-function Internal Exception Handler 未捕獲異常,內部異常處理函數不知爲何設置爲on-function,並且不能被調用。 |
7 |
Internal Exception Handler Run-Time Failure 未捕獲的異常, 並且異常處理函數處理時自己拋出了異常。例如,如果 process.on('uncaughtException') 或 domain.on('error') 拋出了異常。 |
8 |
Unused 保留 |
9 |
Invalid Argument 可能是給了未知的參數,或者給的參數沒有值。 |
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 提供了很多有用的屬性,便於我們更好的控制系統的交互:
序號. | 屬性 & 描述 |
---|---|
1 |
stdout 標準輸出流。 |
2 |
stderr 標準錯誤流。 |
3 |
stdin 標準輸入流。 |
4 |
argv argv 屬性返回一個數組,由命令行執行腳本時的各個參數組成。它的第一個成員總是node,第二個成員是腳本文件名,其餘成員是腳本文件的參數。 |
5 |
execPath 返回執行當前腳本的 Node 二進制文件的絕對路徑。 |
6 |
execArgv 返回一個數組,成員是命令行下執行腳本時,在Node可執行文件與腳本文件之間的命令行參數。 |
7 |
env 返回一個對象,成員爲當前 shell 的環境變量 |
8 |
exitCode 進程退出時的代碼,如果進程優通過 process.exit() 退出,不需要指定退出碼。 |
9 |
version Node 的版本,比如v0.10.18。 |
10 |
versions 一個屬性,包含了 node 的版本和依賴. |
11 |
config 一個包含用來編譯當前 node 執行文件的 javascript 配置選項的對象。它與運行 ./configure 腳本生成的 "config.gypi" 文件相同。 |
12 |
pid 當前進程的進程號。 |
13 |
title 進程名,默認值爲"node",可以自定義該值。 |
14 |
arch 當前 CPU 的架構:'arm'、'ia32' 或者 'x64'。 |
15 |
platform 運行程序所在的平臺系統 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32' |
16 |
mainModule require.main 的備選方法。不同點,如果主模塊在運行時改變,require.main可能會繼續返回老的模塊。可以認爲,這兩者引用了同一個模塊。 |
實例
創建文件 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 提供了很多有用的方法,便於我們更好的控制系統的交互:
序號 | 方法 & 描述 |
---|---|
1 |
abort() 這將導致 node 觸發 abort 事件。會讓 node 退出並生成一個核心文件。 |
2 |
chdir(directory) 改變當前工作進程的目錄,如果操作失敗拋出異常。 |
3 |
cwd() 返回當前進程的工作目錄 |
4 |
exit([code]) 使用指定的 code 結束進程。如果忽略,將會使用 code 0。 |
5 |
getgid() 獲取進程的羣組標識(參見 getgid(2))。獲取到得時羣組的數字 id,而不是名字。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
6 |
setgid(id) 設置進程的羣組標識(參見 setgid(2))。可以接收數字 ID 或者羣組名。如果指定了羣組名,會阻塞等待解析爲數字 ID 。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
7 |
getuid() 獲取進程的用戶標識(參見 getuid(2))。這是數字的用戶 id,不是用戶名。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
8 |
setuid(id) 設置進程的用戶標識(參見setuid(2))。接收數字 ID或字符串名字。果指定了羣組名,會阻塞等待解析爲數字 ID 。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
9 |
getgroups() 返回進程的羣組 iD 數組。POSIX 系統沒有保證一定有,但是 node.js 保證有。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
10 |
setgroups(groups) 設置進程的羣組 ID。這是授權操作,所有你需要有 root 權限,或者有 CAP_SETGID 能力。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
11 |
initgroups(user, extra_group) 讀取 /etc/group ,並初始化羣組訪問列表,使用成員所在的所有羣組。這是授權操作,所有你需要有 root 權限,或者有 CAP_SETGID 能力。 注意:這個函數僅在 POSIX 平臺上可用(例如,非Windows 和 Android)。 |
12 |
kill(pid[, signal]) 發送信號給進程. pid 是進程id,並且 signal 是發送的信號的字符串描述。信號名是字符串,比如 'SIGINT' 或 'SIGHUP'。如果忽略,信號會是 'SIGTERM'。 |
13 |
memoryUsage() 返回一個對象,描述了 Node 進程所用的內存狀況,單位爲字節。 |
14 |
nextTick(callback) 一旦當前事件循環結束,調用回到函數。 |
15 |
umask([mask]) 設置或讀取進程文件的掩碼。子進程從父進程繼承掩碼。如果mask 參數有效,返回舊的掩碼。否則,返回當前掩碼。 |
16 |
uptime() 返回 Node 已經運行的秒數。 |
17 |
hrtime() 返回當前進程的高分辨時間,形式爲 [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/runoob/nodejs
當前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }