在 2021 年 7 月 12 日的常规 TC39 会议上,提案 realms 正式进入 stage 3,这也意味着该提案基本完成,在方案设计上不会有太多的变化。

Realms 旨在提供一个独立的 Global 环境执行 JavaScript 代码。提供的方法非常简单,如下:

declare class Realm {
  constructor();
  importValue(specifier: string, bindingName: string): Promise<PrimitiveValueOrCallable>;
  evaluate(sourceText: string): PrimitiveValueOrCallable;
}

用法如下:

// sandbox.js
export function add (a, b) {
	return a + b;
}

// realm.js
const sandbox = new Realm();

// wrappedAdd 是一个被包装的函数对象,通过它可以来间接调用 sandbox 中绑定的真实 add 函数
const wrappedAdd = await sandbox.importValue('./sandbox.js', 'add')

// wrappedAdd 是被转化的安全跨 realm 值
const result = wrappedAdd(2, 3);

globalThis.someValue = 1;
sandbox.evaluate('globalThis.someValue = 2');
console.asset(globalThis.someValue === 1)