js의 var 변수는 window.변수명으로 콜해서 가져올 수 있는데,

let과 const는 window Object에 속한 것이 아니라서 가져올 수가 없다.


const a = "변수값"

window.a = a


이렇게 하거나 Function으로 감싸서 return 시켜주면 let과 const 변수에 접근이 가능한 것 같다.

eval을 쓰는 방법도 있는데 MDN 보니까 이건 쓰지 말라고 해서 안쓰는게 좋겠다.


아래 두 개의 함수는 소괄호 체크하는 부분을 제외하고 같은 동작을 수행한다.


JS

function evaluateString(cmd) {
"use strict";
return new Function("return " + cmd + "")()
}


Go

var g = js.Global()
var reFuncExist = regexp.MustCompile(`[(|)]+`)

func getValue(this js.Value, d []js.Value) any {
if len(d) < 1 {
return js.Undefined()
}

varName := d[0].String()
matches := reFuncExist.FindStringSubmatch(varName)

if len(matches) > 0 {
return js.Undefined()
}

// f := g.Call("eval", varName+"")
f1 := g.Call("Function", "'use strict'; return "+varName)
f2 := f1.Invoke()

return f2
}

func main() {
c := make(chan struct{}, 0)
g.Set("getvalue", js.FuncOf(getValue))
<-c
}



다만, Function에 입력 받은 문자열을 바로 넣어버리면 변수값 말고 함수까지 실행해버려서 함수 실행을 막는 장치는 있어야 될 것 같은데..


js.Global().Call() 실행 직후의 타입은 무조건 Function 아니면 function 으로 뱉어내고,

Invoke() 이후에는 원래의 타입을 제대로 알려주지만, 실행도 무조건 되어버려서 쓸모가 없다.


JS도 결과유형을 Invoke() 시점에나 알려주는 것은 Go와 동일하다. ( 뒤쪽 () 없으면 함수원형 표시, 있으면 함수 무조건 실행 )


함수인지 아닌지를 문자열 안에 소괄호() 의 존재 여부로 판단하는 것 말고는 떠오르는게 없어서 깝깝하다.



practice-golang/hello-wasm: Practice go/misc/wasm (github.com)


끝.