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)");