在 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)