Like Share Discussion Bookmark Smile

J.J. Huang   2020-01-28   Node.js   瀏覽次數:

Node.js | Global Object(全局對象)

簡介

JavaScript中有一個特殊的對象,稱為全局對象Global Object,它及其所有屬性都可以在程序的任何地方訪問,即全局變量。

在瀏覽器JavaScript中,通常window是全局對象,而Node.js中的全局對像是global,所有全局變量(除了global本身以外)都是 global對象的屬性。

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

關於JavaScriptGlobal Variable,可以參考此篇Javascript Global Variable 全域變數與 Local Variable 區域變數](wibibi.com/info.php?tid=277)

註:詳細Doc Link

全局對象與全局變量

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

  • 在最外層定義的變量
  • 全局對象的屬性
  • 隱式定義的變量(未定義直接賦值的變量)

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

注意:最好不要使用var定義變量以避免引入全局變量,因為全局變量會污染命名空間,提高程式的耦合風險。

__filename

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

1
console.log(__filename);

執行結果如下:

1
2
$ node main.js
/Users/morose/Documents/Temp/Example/main.js

__dirname

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

1
console.log(__dirname);

執行結果如下:

1
2
$ node main.js
/Users/morose/Documents/Temp/Example

setTimeout(cb, ms)

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

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

1
2
3
4
5
function printHello(){
   console.log( "Hello, World!");
}
// 兩秒後執行以上函數
setTimeout(printHello, 2000);

執行結果如下:

1
2
$ node main.js
Hello, World!

clearTimeout(t)

clearTimeout(t)全局函數用於停止一個之前通過setTimeout()建立的定時器。
參數t是通過setTimeout()函數建立的定時器。

1
2
3
4
5
6
7
8
function printHello(){
   console.log( "Hello, World!");
}
// 兩秒後執行以上函數
var t = setTimeout(printHello, 2000);

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

執行結果如下:

1
$ node main.js

setInterval(cb, ms)

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

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

setInterval()方法會不停地調用函數,直到clearInterval()被調用或窗口被關閉。

1
2
3
4
5
6
7
8
9
10
11
function printHello(){
   console.log( "Hello, World!");
}
// 兩秒後執行以上函數
var t = setInterval(printHello, 2000);

function stopPrint(){
clearInterval(t);
}
// 十一秒後執行清除定時器(clearInterval)
setTimeout(stopPrint, 11000);

執行結果如下:

1
2
3
4
5
6
$ node main.js
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!

console

console用於提供控制台標準輸出,它是由Internet ExplorerJScript引擎提供的調試工具,後來逐漸成為瀏覽器的實施標準。

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

console 方法

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

範例

  • console.log

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

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

1
2
3
console.log('Hello world');
console.log('morose%ddog');
console.log('morose%ddog', 666);

執行結果如下:

1
2
3
4
$ node main.js
Hello world
morose%ddog
morose666dog
  • console.trace()
1
console.trace();

執行結果如下:

1
2
3
4
5
6
7
8
9
$ node main.js
Trace
at Object.<anonymous> (/Users/morose/Documents/Temp/Example/main.js:1:9)
at Module._compile (internal/modules/cjs/loader.js:956:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
at Module.load (internal/modules/cjs/loader.js:812:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
at internal/main/run_main_module.js:17:11
  • console.info()、console.time()、console.timeEnd()
1
2
3
4
5
6
7
8
9
10
11
12
console.info("開始執行:");

var counter = 10;
console.log("計數: %d", counter);

console.time("獲取資料");
//
// 執行一些程式
//
console.timeEnd('獲取資料');

console.info("執行完畢。")

執行結果如下:

1
2
3
4
5
$ node main.js
開始執行:
計數: 10
獲取資料: 0.829ms
執行完畢。

process

process是一個全局變量,即global`對象的屬性。

它用於描述當前Node.js進程狀態的對象,提供了一個與操作系統的簡單接口。
通常在你寫本地指令行程序的時候,少不了要 ​和它打交道。下面將會介紹process對象的一些最常用的成員方法。

序號 方法 & 描述 Doc
1 exit
當進程準備退出時觸發。
Link
2 beforeExit
當 node 清空事件循環,並且沒有其他安排時觸發這個事件。通常來說,當沒有進程安排時 node 退出,但是 ‘beforeExit’ 的監聽器可以異步調用,這樣 node 就會繼續執行。
Link
3 uncaughtException
當一個異常冒泡回到事件循環,觸發這個事件。如果給異常添加了監視器,默認的操作(打印堆棧跟踪訊息並退出)就不會發生。
Link
4 Signal 事件
當進程接收到信號時就觸發。信號列表詳見標準的 POSIX 信號名,如 SIGINT、SIGUSR1 等。
Link

範例

1
2
3
4
5
6
7
8
9
10
process.on('exit', function(code) {

  // 以下程式永遠不會執行
  setTimeout(function() {
    console.log("該程式不會執行");
  }, 0);
  
  console.log('退出碼為:', code);
});
console.log("執行結束");

執行結果如下:

1
2
3
$ node main.js
執行結束
退出碼為: 0

退出狀態碼

Doc Link

狀態碼 名稱 & 描述
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提供了很多有用的屬性,便於我們更好的控制系統的交互。

序號 屬性 & 描述 Doc
1 stdout
標準輸出流。
Link
2 stderr
標準錯誤流。
Link
3 stdin
標準輸入流。
Link
4 argv
argv 屬性返回一個數組,由指令行執行腳本時的各個參數組成。它的第一個成員總是node,第二個成員是腳本文件名,其餘成員是腳本文件的參數。
Link
5 execPath
返回執行當前腳本的 Node 二進製文件的絕對路徑。
Link
6 execArgv
返回一個數組,成員是指令行下執行腳本時,在Node可執行文件與腳本文件之間的指令行參數。
Link
7 env
返回一個對象,成員為當前 shell 的環境變量
Link
8 exitCode
進程退出時的程式碼,如果進程優通過 process.exit() 退出,不需要指定退出碼。
Link
9 version
Node 的版本,比如v0.10.18。
Link
10 versions
一個屬性,包含了 node 的版本和依賴.
Link
11 config
一個包含用來編譯當前 node 執行文件的 javascript 配置選項的對象。它與運行 ./configure 腳本生成的 “config.gypi” 文件相同。
Link
12 pid
當前進程的進程號。
Link
13 title
進程名,默認值為”node”,可以自定義該值。
Link
14 arch
當前 CPU 的架構:’arm’、’ia32’ 或者 ‘x64’。
Link
15 platform
運行程序所在的平台系統 ‘darwin’, ‘freebsd’, ‘linux’, ‘sunos’ 或 ‘win32’
Link
16 mainModule
require.main 的備選方法。不同點,如果主模組在運行時改變,require.main可能會繼續返回老的模組。可以認為,這兩者引用了同一個模組。
Link

範例

1
2
3
4
5
6
7
8
9
10
11
12
13
// 輸出到終端
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);

執行結果如下:

1
2
3
4
5
6
$ node main.js
Hello World!
0: /usr/local/bin/node
1: /Users/morose/Documents/Temp/Example/main.js
/usr/local/bin/node
darwin

Process 方法

序號 方法 & 描述 Doc
1 abort()
這將導致 node 觸發 abort 事件。會讓 node 退出並生成一個核心文件。
Link
2 chdir(directory)
改變當前工作進程的目錄,如果操作失敗拋出異常。
Link
3 cwd()
返回當前進程的工作目錄
Link
4 exit([code])
使用指定的 code 結束進程。如果忽略,將會使用 code 0。
Link
5 getgid()
獲取進程的群組標識。獲取到得時群組的數字 id,而不是名字。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
6 setgid(id)
設置進程的群組標識。可以接收數字 ID 或者群組名。如果指定了群組名,會阻塞等待解析為數字 ID 。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
7 getuid()
獲取進程的用戶標識。這是數字的用戶 id,不是用戶名。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
8 setuid(id)
設置進程的用戶標識。接收數字 ID或字符串名字。果指定了群組名,會阻塞等待解析為數字 ID 。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
9 getgroups()
返回進程的群組 iD 數組。 POSIX 系統沒有保證一定有,但是 node.js 保證有。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
10 setgroups(groups)
設置進程的群組 ID。這是授權操作,所以你需要有 root 權限,或者有 CAP_SETGID 能力。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
11 initgroups(user, extra_group)
讀取 /etc/group ,並初始化群組訪問列表,使用成員所在的所有群組。這是授權操作,所以你需要有 root 權限,或者有 CAP_SETGID 能力。
注意:這個函數僅在 POSIX 平台上可用(例如,非Windows 和 Android)。
Link
12 kill(pid[, signal])
發送信號給進程. pid 是進程id,並且 signal 是發送的信號的字符串描述。信號名是字符串,比如 ‘SIGINT’ 或 ‘SIGHUP’。如果忽略,信號會是 ‘SIGTERM’。
Link
13 memoryUsage()
返回一個對象,描述了 Node 進程所用的內存狀況,單位為字節。
Link
14 nextTick(callback)
一旦當前事件循環結束,調用回調函數。
Link
15 umask([mask])
設置或讀取進程文件的掩碼。子進程從父進程繼承掩碼。如果mask 參數有效,返回舊的掩碼。否則,返回當前掩碼。
Link
16 uptime()
返回 Node 已經運行的秒數。
Link
17 hrtime()
返回當前進程的高分辨時間,形式​​為 [seconds, nanoseconds]數組。它是相對於過去的任意事件。該值與日期無關,因此不受時鐘漂移的影響。主要用途是可以通過精確的時間間隔,來衡量程序的性能。
你可以將之前的結果傳遞給當前的 process.hrtime() ,會返回兩者間的時間差,用來基準和測量時間間隔。
Link

範例

1
2
3
4
5
6
7
8
// 輸出當前目錄
console.log('當前目錄: ' + process.cwd());

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

// 輸出內存使用情況
console.log(process.memoryUsage());

執行結果如下:

1
2
3
4
5
6
7
8
9
$ node main.js
當前目錄: /Users/morose/Documents/Temp/Example
當前版本: v12.13.0
{
rss: 18149376,
heapTotal: 4734976,
heapUsed: 2391832,
external: 809877
}

註:以上參考了
Node.js 全局对象