欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js全局對(duì)象Global的實(shí)現(xiàn)

 更新時(shí)間:2023年12月22日 10:48:31   作者:三知之靈  
在Nodejs下全局變量和全局函數(shù)都是可以使用global來(lái)訪問(wèn)到的,本文主要介紹了Node.js全局對(duì)象Global的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

什么是全局對(duì)象 & 全局變量

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

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

在 Node.js 我們可以直接訪問(wèn)到 global 的屬性,而不需要在應(yīng)用中包含它。

全局對(duì)象與全局變量

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

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

當(dāng)你定義一個(gè)全局變量時(shí),這個(gè)變量同時(shí)也會(huì)成為全局對(duì)象的屬性,反之亦然。需要注意的是,在 Node.js 中你不可能在最外層定義變量,因?yàn)樗杏脩舸a都是屬于當(dāng)前模塊的, 而模塊本身不是最外層上下文

注意: 最好不要使用 var 定義變量以避免引入全局變量,因?yàn)槿肿兞繒?huì)污染命名空間,提高代碼的耦合風(fēng)險(xiǎn)。

所以在下一代的代碼規(guī)范ES6中,使用了let/const 來(lái)定義數(shù)據(jù);

main.js,查看全局對(duì)象global

console.dir(global, {depth: 0});

//執(zhí)行 node main.js
//默認(rèn)打?。?

/* <ref *1> Object [global] {
  global: [Circular *1],
  clearInterval: [Function: clearInterval],
  clearTimeout: [Function: clearTimeout],
  setInterval: [Function: setInterval],
  setTimeout: [Function],
  queueMicrotask: [Function: queueMicrotask],
  clearImmediate: [Function: clearImmediate],
  setImmediate: [Function]
} */

以上顯示內(nèi)容均是可以在全局使用的,可以直接使用

全局變量-- __filename

__filename 表示當(dāng)前正在執(zhí)行的腳本的文件名。它將輸出文件所在位置的絕對(duì)路徑(包括文件名),且和命令行參數(shù)所指定的文件名不一定相同。 如果在模塊中,返回的值是模塊文件的路徑。

創(chuàng)建 main.js 文件,代碼如下所示:

console.log( __filename );
//終端執(zhí)行 node main.js
//輸出
//D:\WK\webstorm\test\temp.cjs

全局變量-- __dirname

__dirname 表示當(dāng)前執(zhí)行腳本所在的目錄。

創(chuàng)建文件 main.js ,代碼如下所示:

console.log( __dirname );
//終端執(zhí)行 node main.js
//輸出
//D:\WK\webstorm\test

全局函數(shù)-- setTimeout(cb, ms)

setTimeout(cb, ms) 全局函數(shù)在指定的毫秒(ms)數(shù)后執(zhí)行指定函數(shù)(cb)。setTimeout() 只執(zhí)行一次指定函數(shù)。返回一個(gè)代表定時(shí)器的句柄值。

創(chuàng)建文件 main.js ,代碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 兩秒后執(zhí)行以上函數(shù)
setTimeout(printHello, 2000);
//終端執(zhí)行 node main.js
//輸出
//Hello, World!

全局函數(shù)-- clearTimeout(t)

clearTimeout( t ) 全局函數(shù)用于停止一個(gè)之前通過(guò) setTimeout() 創(chuàng)建的定時(shí)器。 參數(shù) t 是通過(guò) setTimeout() 函數(shù)創(chuàng)建的定時(shí)器

創(chuàng)建文件 main.js ,代碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 兩秒后執(zhí)行以上函數(shù)
var t =setTimeout(printHello, 2000);

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

//終端執(zhí)行 node main.js
//輸出

之所以以上代碼沒有輸出,是因?yàn)榍宄〞r(shí)器時(shí),定時(shí)器尚且沒有執(zhí)行

全局函數(shù)-- setInterval(cb, ms)

setInterval(cb, ms) 全局函數(shù)在指定的毫秒(ms)數(shù)后執(zhí)行指定函數(shù)(cb)。返回一個(gè)代表定時(shí)器的句柄值??梢允褂?clearInterval(t) 函數(shù)來(lái)清除定時(shí)器。

setInterval() 方法會(huì)不停地調(diào)用函數(shù),直到 clearInterval() 被調(diào)用或窗口被關(guān)閉。

創(chuàng)建文件 main.js ,代碼如下所示:

function printHello(){
   console.log( "Hello, World!");
}
// 兩秒后執(zhí)行以上函數(shù)
var t =setInterval(printHello, 2000);

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

//終端執(zhí)行 node main.js
//輸出
//Hello, World!
//Hello, World!
//Hello, World!
//Hello, World!

若是沒有清除定時(shí)器時(shí),則會(huì)定時(shí)不停的輸出Hello, World!,直到窗口關(guān)閉或者終端按下 ctrl+c 鍵,在代碼中也最好根據(jù)需要決定是否需要清除setInterval,否則可能會(huì)造成內(nèi)存的泄漏

全局變量-- console

console 用于提供控制臺(tái)標(biāo)準(zhǔn)輸出,它是由 Internet Explorer 的 JScript 引擎提供的調(diào)試工具,后來(lái)逐漸成為瀏覽器的實(shí)施標(biāo)準(zhǔn)。

Node.js 沿用了這個(gè)標(biāo)準(zhǔn),提供與習(xí)慣行為一致的 console 對(duì)象,用于向標(biāo)準(zhǔn)輸出流(stdout)或標(biāo)準(zhǔn)錯(cuò)誤流(stderr)輸出字符。

console 方法概覽

方法描述
console.log([data][, …])向標(biāo)準(zhǔn)輸出流打印字符并以換行符結(jié)束。該方法接收若干 個(gè)參數(shù),如果只有一個(gè)參數(shù),則輸出這個(gè)參數(shù)的字符串形式。如果有多個(gè)參數(shù),則 以類似于C 語(yǔ)言 printf() 命令的格式輸出。
console.info([data][, …])該命令的作用是返回信息性消息,這個(gè)命令與console.log差別并不大,除了在chrome中只會(huì)輸出文字外,其余的會(huì)顯示一個(gè)藍(lán)色的驚嘆號(hào)。
console.error([data][, …])輸出錯(cuò)誤消息的??刂婆_(tái)在出現(xiàn)錯(cuò)誤時(shí)會(huì)顯示是紅色的叉子。
console.warn([data][, …])輸出警告消息??刂婆_(tái)出現(xiàn)有黃色的驚嘆號(hào)。
console.dir(obj[, options])用來(lái)對(duì)一個(gè)對(duì)象進(jìn)行檢查(inspect),并以易于閱讀和打印的格式顯示。
console.time(label)輸出時(shí)間,表示計(jì)時(shí)開始。
console.timeEnd(label)結(jié)束時(shí)間,表示計(jì)時(shí)結(jié)束。
console.trace(message[, …])當(dāng)前執(zhí)行的代碼在堆棧中的調(diào)用路徑,這個(gè)測(cè)試函數(shù)運(yùn)行很有幫助,只要給想測(cè)試的函數(shù)里面加入 console.trace 就行了。
console.assert(value[, message][, …])用于判斷某個(gè)表達(dá)式或變量是否為真,接收兩個(gè)參數(shù),第一個(gè)參數(shù)是表達(dá)式,第二個(gè)參數(shù)是字符串。只有當(dāng)?shù)谝粋€(gè)參數(shù)為false,才會(huì)輸出第二個(gè)參數(shù),否則不會(huì)有任何結(jié)果。

全局變量-- process

process 是一個(gè)全局變量,即 global 對(duì)象的屬性。

它用于描述當(dāng)前Node.js 進(jìn)程狀態(tài)的對(duì)象,提供了一個(gè)與操作系統(tǒng)的簡(jiǎn)單接口。通常在寫本地命令行程序的時(shí)候,少不了要和它打交道。下面將會(huì)介紹 process 對(duì)象的一些最常用的成員方法。

process 事件

事件描述
exit當(dāng)進(jìn)程準(zhǔn)備退出時(shí)觸發(fā)。
beforeExit當(dāng) node 清空事件循環(huán),并且沒有其他安排時(shí)觸發(fā)這個(gè)事件。通常來(lái)說(shuō),當(dāng)沒有進(jìn)程安排時(shí) node 退出,但是 ‘beforeExit’ 的監(jiān)聽器可以異步調(diào)用,這樣 node 就會(huì)繼續(xù)執(zhí)行。
uncaughtException當(dāng)一個(gè)異常冒泡回到事件循環(huán),觸發(fā)這個(gè)事件。如果給異常添加了監(jiān)視器,默認(rèn)的操作(打印堆棧跟蹤信息并退出)就不會(huì)發(fā)生。
Signal 事件當(dāng)進(jìn)程接收到信號(hào)時(shí)就觸發(fā)。信號(hào)列表詳見標(biāo)準(zhǔn)的 POSIX 信號(hào)名,如 SIGINT、SIGUSR1 等

示例

main.js示例:

process.on('exit', function(code) {
  // 以下代碼永遠(yuǎn)不會(huì)執(zhí)行
  setTimeout(function() {
    console.log("該代碼不會(huì)執(zhí)行");
  }, 0);
  
  console.log('退出碼為:', code);
});
console.log("程序執(zhí)行結(jié)束");
//終端執(zhí)行 node main.js
//輸出
//程序執(zhí)行結(jié)束
//退出碼為: 0

退出狀態(tài)碼

狀態(tài)碼名稱描述
1Uncaught Fatal Exception有未捕獲異常,并且沒有被域或 uncaughtException 處理函數(shù)處理。
2Unused保留,由 Bash 預(yù)留用于內(nèi)置誤用
3Internal JavaScript Parse ErrorJavaScript的源碼啟動(dòng) Node 進(jìn)程時(shí)引起解析錯(cuò)誤。非常罕見,僅會(huì)在開發(fā) Node 時(shí)才會(huì)有。
4Internal JavaScript Evaluation FailureJavaScript 的源碼啟動(dòng) Node 進(jìn)程,評(píng)估時(shí)返回函數(shù)失敗。非常罕見,僅會(huì)在開發(fā) Node 時(shí)才會(huì)有。
5Fatal ErrorV8 里致命的不可恢復(fù)的錯(cuò)誤。通常會(huì)打印到 stderr ,內(nèi)容為: FATAL ERROR
6Non-function Internal Exception Handler未捕獲異常,內(nèi)部異常處理函數(shù)不知為何設(shè)置為on-function,并且不能被調(diào)用。
7Internal Exception Handler Run-Time Failure未捕獲的異常, 并且異常處理函數(shù)處理時(shí)自己拋出了異常。例如,如果 process.on(‘uncaughtException’) 或 domain.on(‘error’) 拋出了異常。
8Unused保留,在以前版本的 Node.js 中,退出碼 8 有時(shí)表示未捕獲的異常。
9Invalid Argument可能是給了未知的參數(shù),或者給的參數(shù)沒有值。
10Internal JavaScript Run-Time FailureJavaScript的源碼啟動(dòng) Node 進(jìn)程時(shí)拋出錯(cuò)誤,非常罕見,僅會(huì)在開發(fā) Node 時(shí)才會(huì)有。
12Invalid Debug Argument設(shè)置了參數(shù)–debug 和/或 --debug-brk,但是選擇了錯(cuò)誤端口。
128Signal Exits如果 Node 接收到致命信號(hào),比如SIGKILL 或 SIGHUP,那么退出代碼就是128 加信號(hào)代碼。這是標(biāo)準(zhǔn)的 Unix 做法,退出信號(hào)代碼放在高位。

Process 屬性

Process 提供了很多有用的屬性,便于我們更好的控制系統(tǒng)的交互

屬性描述
stdout標(biāo)準(zhǔn)輸出流。
stderr標(biāo)準(zhǔn)錯(cuò)誤流。
stdin標(biāo)準(zhǔn)輸入流。
argv返回一個(gè)數(shù)組,由命令行執(zhí)行腳本時(shí)的各個(gè)參數(shù)組成。它的第一個(gè)成員總是node,第二個(gè)成員是腳本文件名,其余成員是腳本文件的參數(shù)。
execPath返回執(zhí)行當(dāng)前腳本的 Node 二進(jìn)制文件的絕對(duì)路徑。
execArgv返回一個(gè)數(shù)組,成員是命令行下執(zhí)行腳本時(shí),在Node可執(zhí)行文件與腳本文件之間的命令行參數(shù)。
env返回一個(gè)對(duì)象,成員為當(dāng)前 shell 的環(huán)境變量
exitCode進(jìn)程退出時(shí)的代碼,如果進(jìn)程通過(guò) process.exit() 退出,不需要指定退出碼。
versionNode 的版本,比如v0.10.18
versions一個(gè)屬性,包含了 node 的版本和依賴.
config一個(gè)包含用來(lái)編譯當(dāng)前 node 執(zhí)行文件的 javascript 配置選項(xiàng)的對(duì)象。它與運(yùn)行 ./configure 腳本生成的 “config.gypi” 文件相同。
pid當(dāng)前進(jìn)程的進(jìn)程號(hào)
title進(jìn)程名,默認(rèn)值為"node",可以自定義該值
arch當(dāng)前 CPU 的架構(gòu):‘arm’、‘ia32’ 或者 ‘x64’。
platform運(yùn)行程序所在的平臺(tái)系統(tǒng) ‘darwin’, ‘freebsd’, ‘linux’, ‘sunos’ 或 ‘win32’
mainModulerequire.main 的備選方法。不同點(diǎn),如果主模塊在運(yùn)行時(shí)改變,require.main可能會(huì)繼續(xù)返回老的模塊??梢哉J(rèn)為,這兩者引用了同一個(gè)模塊。

示例

main.js

// 輸出到終端
process.stdout.write("Hello World!" + "\n");
// 通過(guò)參數(shù)讀取
process.argv.forEach(function(val, index, array) {
   console.log(index + ': ' + val);
});
// 獲取執(zhí)行路徑
console.log(process.execPath);
// 平臺(tái)信息
console.log(process.platform);

//終端執(zhí)行 node main.js
//輸出
//Hello World!
//0: node
//1: /web/www/node/main.js
///usr/local/node/0.10.36/bin/node
//darwin

Process方法

Process 提供了很多有用的方法,便于我們更好的控制系統(tǒng)的交互

方法描述
abort()導(dǎo)致 node 觸發(fā) abort 事件。讓 node 退出并生成一個(gè)核心文件
chdir(directory)改變當(dāng)前工作進(jìn)程的目錄,如果操作失敗拋出異常
cwd()返回當(dāng)前進(jìn)程的工作目錄
exit([code])使用指定的 code 結(jié)束進(jìn)程。如果忽略,將會(huì)使用 code 0
getgid()獲取進(jìn)程的群組標(biāo)識(shí)(參見 getgid(2))。獲取到的是群組的數(shù)字 id,而不是名字.注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)。
setgid(id)設(shè)置進(jìn)程的群組標(biāo)識(shí)(參見 setgid(2))。可以接收數(shù)字 ID 或者群組名。如果指定了群組名,會(huì)阻塞等待解析為數(shù)字 ID 。注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)
getuid()獲取進(jìn)程的用戶標(biāo)識(shí)(參見 getuid(2))。這是數(shù)字的用戶 id,不是用戶名。注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)。
setuid(id)設(shè)置進(jìn)程的用戶標(biāo)識(shí)(參見setuid(2))。接收數(shù)字 ID或字符串名字。如果指定了群組名,會(huì)阻塞等待解析為數(shù)字 ID 。注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)。
getgroups()返回進(jìn)程的群組 ID 數(shù)組。POSIX 系統(tǒng)沒有保證一定有,但是 node.js 保證有。注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)。
setgroups(groups)設(shè)置進(jìn)程的群組 ID。這是授權(quán)操作,所以你需要有 root 權(quán)限,或者有 CAP_SETGID 能力。注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)。
initgroups(user, extra_group)讀取 /etc/group ,并初始化群組訪問(wèn)列表,使用成員所在的所有群組。這是授權(quán)操作,所以你需要有 root 權(quán)限,或者有 CAP_SETGID 能力。注意:這個(gè)函數(shù)僅在 POSIX 平臺(tái)上可用(例如,非Windows 和 Android)。
kill(pid[, signal])發(fā)送信號(hào)給進(jìn)程. pid 是進(jìn)程id,并且 signal 是發(fā)送的信號(hào)的字符串描述。信號(hào)名是字符串,比如 ‘SIGINT’ 或 ‘SIGHUP’。如果忽略,信號(hào)會(huì)是 ‘SIGTERM’。
memoryUsage()返回一個(gè)對(duì)象,描述了 Node 進(jìn)程所用的內(nèi)存狀況,單位為字節(jié)。
nextTick(callback)一旦當(dāng)前事件循環(huán)結(jié)束,調(diào)用回調(diào)函數(shù)。
umask([mask])設(shè)置或讀取進(jìn)程文件的掩碼。子進(jìn)程從父進(jìn)程繼承掩碼。如果mask 參數(shù)有效,返回舊的掩碼。否則,返回當(dāng)前掩碼。
uptime()返回 Node 已經(jīng)運(yùn)行的秒數(shù)。
hrtime()返回當(dāng)前進(jìn)程的高分辨時(shí)間,形式為 [seconds, nanoseconds]數(shù)組。它是相對(duì)于過(guò)去的任意事件。該值與日期無(wú)關(guān),因此不受時(shí)鐘漂移的影響。主要用途是可以通過(guò)精確的時(shí)間間隔,來(lái)衡量程序的性能??梢詫⒅暗慕Y(jié)果傳遞給當(dāng)前的 process.hrtime() ,會(huì)返回兩者間的時(shí)間差,用來(lái)基準(zhǔn)和測(cè)量時(shí)間間隔。

示例

main.js

// 輸出當(dāng)前目錄
console.log('當(dāng)前目錄: ' + process.cwd());
// 輸出當(dāng)前版本
console.log('當(dāng)前版本: ' + process.version);
// 輸出內(nèi)存使用情況
console.log(process.memoryUsage());
//終端執(zhí)行 node main.js
//輸出
//當(dāng)前目錄: /web/com/nodejs
//當(dāng)前版本: v0.10.36
//{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 }

添加全局對(duì)象

gloabal.answer=42;
//可以直接使用全局的值,不必通過(guò)gloabal.answer獲取
console.log(answer)//42

但是不推薦在global對(duì)象上附加任何其它的值,可以將其視為node的內(nèi)置對(duì)象

到此這篇關(guān)于Node.js全局對(duì)象Global的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Node.js全局對(duì)象Global內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論