diff --git a/src/crypto/rand/rand_js.go b/src/crypto/rand/rand_js.go
index bc54ccd37d1c1b15ee5380ad7591808c921ae2ae..89247693a77cffedc7badda5172b85686fabac65 100644
--- a/src/crypto/rand/rand_js.go
+++ b/src/crypto/rand/rand_js.go
@@ -12,7 +12,7 @@ func init() {
 	Reader = &reader{}
 }
 
-var jsCrypto = js.Global.Get("crypto")
+var jsCrypto = js.Global().Get("crypto")
 
 // reader implements a pseudorandom generator
 // using JavaScript crypto.getRandomValues method.
diff --git a/src/net/http/roundtrip_js.go b/src/net/http/roundtrip_js.go
index e99d418da43446194c3806c01951dfca1a317e7d..c183f87fff51c0f7a2a2b5f084df6480178bf3ad 100644
--- a/src/net/http/roundtrip_js.go
+++ b/src/net/http/roundtrip_js.go
@@ -22,28 +22,28 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
 	if useFakeNetwork() {
 		return t.roundTrip(req)
 	}
-	headers := js.Global.Get("Headers").New()
+	headers := js.Global().Get("Headers").New()
 	for key, values := range req.Header {
 		for _, value := range values {
 			headers.Call("append", key, value)
 		}
 	}
 
-	ac := js.Global.Get("AbortController")
-	if ac != js.Undefined {
+	ac := js.Global().Get("AbortController")
+	if ac != js.Undefined() {
 		// Some browsers that support WASM don't necessarily support
 		// the AbortController. See
 		// https://developer.mozilla.org/en-US/docs/Web/API/AbortController#Browser_compatibility.
 		ac = ac.New()
 	}
 
-	opt := js.Global.Get("Object").New()
+	opt := js.Global().Get("Object").New()
 	// See https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
 	// for options available.
 	opt.Set("headers", headers)
 	opt.Set("method", req.Method)
 	opt.Set("credentials", "same-origin")
-	if ac != js.Undefined {
+	if ac != js.Undefined() {
 		opt.Set("signal", ac.Get("signal"))
 	}
 
@@ -62,7 +62,7 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
 		req.Body.Close()
 		opt.Set("body", body)
 	}
-	respPromise := js.Global.Call("fetch", req.URL.String(), opt)
+	respPromise := js.Global().Call("fetch", req.URL.String(), opt)
 	var (
 		respCh = make(chan *Response, 1)
 		errCh  = make(chan error, 1)
@@ -90,7 +90,7 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
 
 		b := result.Get("body")
 		var body io.ReadCloser
-		if b != js.Undefined {
+		if b != js.Undefined() {
 			body = &streamReader{stream: b.Call("getReader")}
 		} else {
 			// Fall back to using ArrayBuffer
@@ -122,7 +122,7 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) {
 	respPromise.Call("then", success, failure)
 	select {
 	case <-req.Context().Done():
-		if ac != js.Undefined {
+		if ac != js.Undefined() {
 			// Abort the Fetch request
 			ac.Call("abort")
 		}
@@ -225,7 +225,7 @@ func (r *arrayReader) Read(p []byte) (n int, err error) {
 		)
 		success := js.NewCallback(func(args []js.Value) {
 			// Wrap the input ArrayBuffer with a Uint8Array
-			uint8arrayWrapper := js.Global.Get("Uint8Array").New(args[0])
+			uint8arrayWrapper := js.Global().Get("Uint8Array").New(args[0])
 			value := make([]byte, uint8arrayWrapper.Get("byteLength").Int())
 			js.ValueOf(value).Call("set", uint8arrayWrapper)
 			bCh <- value
diff --git a/src/syscall/fs_js.go b/src/syscall/fs_js.go
index 141d46803c81e3108a773dd6f77c9fe7f2d106e2..64b7b8a1ad52687ecdb214513e57f0f9588f6826 100644
--- a/src/syscall/fs_js.go
+++ b/src/syscall/fs_js.go
@@ -15,8 +15,8 @@ import (
 // Provided by package runtime.
 func now() (sec int64, nsec int32)
 
-var jsProcess = js.Global.Get("process")
-var jsFS = js.Global.Get("fs")
+var jsProcess = js.Global().Get("process")
+var jsFS = js.Global().Get("fs")
 var constants = jsFS.Get("constants")
 
 var (
diff --git a/src/syscall/js/callback.go b/src/syscall/js/callback.go
index 2c693240fad488323b0f0070449e77104c4ebcd3..cfcce693cb2ce3a46e1e18a055979e2876a4bf0e 100644
--- a/src/syscall/js/callback.go
+++ b/src/syscall/js/callback.go
@@ -8,9 +8,9 @@ package js
 
 import "sync"
 
-var pendingCallbacks = Global.Get("Array").New()
+var pendingCallbacks = Global().Get("Array").New()
 
-var makeCallbackHelper = Global.Call("eval", `
+var makeCallbackHelper = Global().Call("eval", `
 	(function(id, pendingCallbacks, resolveCallbackPromise) {
 		return function() {
 			pendingCallbacks.push({ id: id, args: arguments });
@@ -19,7 +19,7 @@ var makeCallbackHelper = Global.Call("eval", `
 	})
 `)
 
-var makeEventCallbackHelper = Global.Call("eval", `
+var makeEventCallbackHelper = Global().Call("eval", `
 	(function(preventDefault, stopPropagation, stopImmediatePropagation, fn) {
 		return function(event) {
 			if (preventDefault) {
@@ -118,7 +118,7 @@ func callbackLoop() {
 		sleepUntilCallback()
 		for {
 			cb := pendingCallbacks.Call("shift")
-			if cb == Undefined {
+			if cb == Undefined() {
 				break
 			}
 
@@ -127,7 +127,7 @@ func callbackLoop() {
 			f, ok := callbacks[id]
 			callbacksMu.Unlock()
 			if !ok {
-				Global.Get("console").Call("error", "call to closed callback")
+				Global().Get("console").Call("error", "call to closed callback")
 				continue
 			}
 
diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go
index cbd0730c643da4ce712da59c24e4226d85b6acf9..93c39652466b3d7644cf07b8e79fa8feef8564d7 100644
--- a/src/syscall/js/js.go
+++ b/src/syscall/js/js.go
@@ -39,23 +39,29 @@ func (e Error) Error() string {
 }
 
 var (
-	// Undefined is the JavaScript value "undefined". The zero Value equals to Undefined.
-	Undefined = makeValue(0)
-
-	// Null is the JavaScript value "null".
-	Null = makeValue(1)
+	valueUndefined         = makeValue(0)
+	valueNull              = makeValue(1)
+	valueGlobal            = makeValue(2)
+	memory                 = makeValue(3) // WebAssembly linear memory
+	resolveCallbackPromise = makeValue(4) // function that the callback helper uses to resume the execution of Go's WebAssembly code
+)
 
-	// Global is the JavaScript global object, usually "window" or "global".
-	Global = makeValue(2)
+// Undefined returns the JavaScript value "undefined".
+func Undefined() Value {
+	return valueUndefined
+}
 
-	// memory is the WebAssembly linear memory.
-	memory = makeValue(3)
+// Null returns the JavaScript value "null".
+func Null() Value {
+	return valueNull
+}
 
-	// resolveCallbackPromise is a function that the callback helper uses to resume the execution of Go's WebAssembly code.
-	resolveCallbackPromise = makeValue(4)
-)
+// Global returns the JavaScript global object, usually "window" or "global".
+func Global() Value {
+	return valueGlobal
+}
 
-var uint8Array = Global.Get("Uint8Array")
+var uint8Array = valueGlobal.Get("Uint8Array")
 
 // ValueOf returns x as a JavaScript value.
 func ValueOf(x interface{}) Value {
@@ -65,7 +71,7 @@ func ValueOf(x interface{}) Value {
 	case Callback:
 		return x.enqueueFn
 	case nil:
-		return Null
+		return valueNull
 	case bool:
 		return makeValue(boolVal(x))
 	case int:
diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go
index 53d21a3f4f3e21c05efa7ee406b0e64670e2ec63..e5e950f3a322885ccab0191f46cb9b1e5b09f3a4 100644
--- a/src/syscall/js/js_test.go
+++ b/src/syscall/js/js_test.go
@@ -12,7 +12,7 @@ import (
 	"testing"
 )
 
-var dummys = js.Global.Call("eval", `({
+var dummys = js.Global().Call("eval", `({
 	someBool: true,
 	someString: "abc\u1234",
 	someInt: 42,
@@ -90,16 +90,16 @@ func TestFloat(t *testing.T) {
 }
 
 func TestUndefined(t *testing.T) {
-	dummys.Set("test", js.Undefined)
-	if dummys == js.Undefined || dummys.Get("test") != js.Undefined || dummys.Get("xyz") != js.Undefined {
+	dummys.Set("test", js.Undefined())
+	if dummys == js.Undefined() || dummys.Get("test") != js.Undefined() || dummys.Get("xyz") != js.Undefined() {
 		t.Errorf("js.Undefined expected")
 	}
 }
 
 func TestNull(t *testing.T) {
 	dummys.Set("test1", nil)
-	dummys.Set("test2", js.Null)
-	if dummys == js.Null || dummys.Get("test1") != js.Null || dummys.Get("test2") != js.Null {
+	dummys.Set("test2", js.Null())
+	if dummys == js.Null() || dummys.Get("test1") != js.Null() || dummys.Get("test2") != js.Null() {
 		t.Errorf("js.Null expected")
 	}
 }
@@ -128,7 +128,7 @@ func TestCall(t *testing.T) {
 	if got := dummys.Call("add", i, 2).Int(); got != 42 {
 		t.Errorf("got %#v, want %#v", got, 42)
 	}
-	if got := dummys.Call("add", js.Global.Call("eval", "40"), 2).Int(); got != 42 {
+	if got := dummys.Call("add", js.Global().Call("eval", "40"), 2).Int(); got != 42 {
 		t.Errorf("got %#v, want %#v", got, 42)
 	}
 }
@@ -141,17 +141,17 @@ func TestInvoke(t *testing.T) {
 }
 
 func TestNew(t *testing.T) {
-	if got := js.Global.Get("Array").New(42).Length(); got != 42 {
+	if got := js.Global().Get("Array").New(42).Length(); got != 42 {
 		t.Errorf("got %#v, want %#v", got, 42)
 	}
 }
 
 func TestInstanceOf(t *testing.T) {
-	someArray := js.Global.Get("Array").New()
-	if got, want := someArray.InstanceOf(js.Global.Get("Array")), true; got != want {
+	someArray := js.Global().Get("Array").New()
+	if got, want := someArray.InstanceOf(js.Global().Get("Array")), true; got != want {
 		t.Errorf("got %#v, want %#v", got, want)
 	}
-	if got, want := someArray.InstanceOf(js.Global.Get("Function")), false; got != want {
+	if got, want := someArray.InstanceOf(js.Global().Get("Function")), false; got != want {
 		t.Errorf("got %#v, want %#v", got, want)
 	}
 }
@@ -165,7 +165,7 @@ func TestCallback(t *testing.T) {
 		c <- struct{}{}
 	})
 	defer cb.Close()
-	js.Global.Call("setTimeout", cb, 0, 42)
+	js.Global().Call("setTimeout", cb, 0, 42)
 	<-c
 }
 
@@ -186,7 +186,7 @@ func TestEventCallback(t *testing.T) {
 		})
 		defer cb.Close()
 
-		event := js.Global.Call("eval", fmt.Sprintf("({ called: false, %s: function() { this.called = true; } })", name))
+		event := js.Global().Call("eval", fmt.Sprintf("({ called: false, %s: function() { this.called = true; } })", name))
 		js.ValueOf(cb).Invoke(event)
 		if !event.Get("called").Bool() {
 			t.Errorf("%s not called", name)
@@ -202,5 +202,5 @@ func ExampleNewCallback() {
 		fmt.Println("button clicked")
 		cb.Close() // close the callback if the button will not be clicked again
 	})
-	js.Global.Get("document").Call("getElementById", "myButton").Call("addEventListener", "click", cb)
+	js.Global().Get("document").Call("getElementById", "myButton").Call("addEventListener", "click", cb)
 }