d8 中有用的內建函式和物件

除了在 EcmaScript 語言規範和 EcmaScript 國際化 API 規範中定義的庫之外,d8 還實現了以下函式和物件。

  • print(args...): function。列印到 stdout
  • printErr(args...): function。列印到 stderr
  • write(args...): function。與 print 相同,但最後沒有換行符。
  • read(filename): function。從檔案中讀取文字並作為 String 返回。
  • readbuffer(filename): function。從檔案中讀取二進位制檔案並作為 ArrayBuffer 返回。
  • readline(): function。從 stdin 讀取行。使用'\'進行多行輸入。
  • load(filename): function。載入並執行 JavaScript 檔案。
  • quit([exitCode]): function。退出並帶有可選的退出程式碼。
  • version(): function。返回版本程式碼為 String
  • os: object。與作業系統相關的實用程式,僅適用於 POSIX。
    • os.system(command): function:執行系統命令。
    • os.chdir(path): function:更改當前目錄。
    • os.setenv(name, value): function:設定環境變數。
    • os.unsetenv(name): function:取消設定環境變數。
    • os.umask(alue) function:呼叫 umask 系統呼叫並返回舊的 umask。
    • os.mkdirp(path[, mask]): function:建立一個目錄。掩碼(如果存在)與當前 umask 一起使用。如有必要,將建立中間目錄。
    • os.rmdir(path): function:刪除目錄。
  • performance: object:用於效能分析。
    • performance.now(): function。將時間戳記返回為 double,以毫秒為單位。
  • Worker: object:從 HTML5 Web Worker 修改 (詳見下面的示例)
  • Realm: object:建立和管理隔離環境(領域)。
    • Realm.create(): function:使用不同的安全令牌建立一個新領域並返回其索引。
    • Realm.createAllowCrossRealmAccess(): function:建立一個與當前領域具有相同安全性令牌的新域並返回其索引。
    • Realm.current(): function:返回當前活動領域的索引。全域性範圍指數為 0。
    • Realm.global(i): function:返回領域 i 的全域性物件。
    • Realm.owner(globalObj): function:返回建立 globalObj 的域的索引。
    • Realm.eval(i, s): function:在領域 i 中評估 s 並返回結果。
    • Realm.switch(i): function:切換到領域 i 以獲得連續的互動式輸入。
    • Realm.dispose(i): function:處理對領域的引用 i。
    • Realm.shared: object:跨域的單個共享值的訪問器。

詳細的實現和註釋可以在 d8.hd8.ccd8-posix.ccd8-windows.cc 中找到

例:

print("Hello World!");
write("Hello ");
write("again!\n");
printErr("Nothing went wrong.");

write("Your name: ");
var name = readline();
print("Hello, ", name, "!");

load("external.js");

var string = read("text.txt");
var buffer = readbuffer("binary.bin");

print("Version: ", version());

quit(0); // bye

工人示例:

main.js

var workerScript = read("worker.js");
var worker = new Worker(workerScript);
worker.postMessage(12);

worker.js

onmessage = ev => {
  print(ev); // 12
};

領域的例子:

print(Realm.current()); // 0

var rIndex = Realm.create();
print(rIndex); // 1

Realm.eval(rIndex, "var x = 100");
Realm.eval(rIndex, "print(x)"); // 100
var result = Realm.eval(rIndex, "x * 2");
print(result); // 200

Realm.eval(rIndex, "var rIndex2 = Realm.create()");
Realm.eval(rIndex, "print(rIndex2)"); // 2
Realm.eval(rIndex, "print(Realm.owner(this))"); // 1

try {
  var childGlobal = Realm.global(rIndex);
  print(childGlobal); // error
} catch (e) {
  print("Global object cannot be read/written cross-realm.");
}

var rIndex3 = Realm.createAllowCrossRealmAccess();
Realm.eval(rIndex, "var x = 50");
var childGlobal = Realm.global(rIndex3);
childGlobal.x++;
Realm.eval(rIndex3, "print(x)"); // 51

try {
  Realm.dispose(rIndex3);
  Realm.eval(rIndex3, "print(x)"); // error
} catch (e) {
  print("The realm is dereferenced");
}

Realm.shared = "Hello from another world";
Realm.eval(rIndex, "print(Realm.shared)");