Node.js 全域性物件
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/itread01/nodejs/main.js
__dirname
__dirname 表示當前執行指令碼所在的目錄。
例項
建立檔案 main.js ,程式碼如下所示:
// 輸出全域性變數 __dirname 的值 console.log( __dirname );
執行 main.js 檔案,程式碼如下所示:
$ node main.js /web/com/itread01/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.jsHello, 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][, ...]) 該命令的作用是返回資訊性訊息,這個命令與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/itread01/nodejs 當前版本: v0.10.36 { rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }