diff --git a/lib/wasm/wasm_exec.js b/lib/wasm/wasm_exec.js index d71af9e97e8ca9..c8bb8d8d40b059 100644 --- a/lib/wasm/wasm_exec.js +++ b/lib/wasm/wasm_exec.js @@ -104,6 +104,7 @@ constructor() { this.argv = ["js"]; this.env = {}; + this.scope = globalThis; this.exit = (code) => { if (code !== 0) { console.warn("exit code:", code); diff --git a/lib/wasm/wasm_exec_node.js b/lib/wasm/wasm_exec_node.js index dd65b19867dcf4..95040fba7d5e4f 100644 --- a/lib/wasm/wasm_exec_node.js +++ b/lib/wasm/wasm_exec_node.js @@ -24,6 +24,7 @@ require("./wasm_exec"); const go = new Go(); go.argv = process.argv.slice(2); go.env = Object.assign({ TMPDIR: require("os").tmpdir() }, process.env); +go.scope = {}; go.exit = process.exit; WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject).then((result) => { process.on("exit", (code) => { // Node.js exits if no event handler is pending diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go index bbf3de199b4b82..ed387338f11b96 100644 --- a/src/syscall/js/js.go +++ b/src/syscall/js/js.go @@ -135,6 +135,12 @@ func Global() Value { return valueGlobal } +// Scope returns the Javascript object attached to the scope field of the Go class. +// If nothing has been explicitly set, behaves like [js.Global]. +func Scope() Value { + return jsGo.Get("scope") +} + // ValueOf returns x as a JavaScript value: // // | Go | JavaScript | diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go index 9ab913f2abf714..d50c7382214b65 100644 --- a/src/syscall/js/js_test.go +++ b/src/syscall/js/js_test.go @@ -733,3 +733,19 @@ func TestGlobal(t *testing.T) { t.Errorf("got %#v, want %#v", got, js.Global()) } } + +func TestScope(t *testing.T) { + ident := js.FuncOf(func(this js.Value, args []js.Value) any { + return args[0] + }) + defer ident.Release() + + js.Scope().Set("key", "value") + if js.Scope().Get("key").String() != "value" { + t.Errorf("get key %s: got %#v", "key", js.Scope().Get("key")) + } + + if got := ident.Invoke(js.Scope()); got.Equal(js.Global()) { + t.Errorf("scope %#v mixed with global %#v", got, js.Global()) + } +}