由于JavaScript函数不可序列化,为了有时(尽管很少)将它们传递到新上下文中,可以将其字符串化,然后稍后重新评估它们,例如:
const foo = () => { // do something }
const fooText = foo.toString()
// later... in new context & scope
const fooFunc = new Function(' return (' + fooText + ').apply(null, arguments)')
fooFunc() // works!
然而,如果foo
引用另一个函数bar
,那么作用域将不会被字符串化,因此如果在新的上下文中未定义bar
,则调用时评估的foo
函数会抛出错误。
我想知道是否有一种递归地字符串化函数的方法?
也就是说,不仅要字符串化父函数,还要字符串化从父函数调用的子函数的内容。
例如:
let bar = () => { alert(1) }
let foo = () => { bar() }
// what toString does
let fooString = foo.toString()
console.log(fooString) // "() => { bar() }"
// what we want
let recursiveFooString = foo.recursiveToString()
console.log(recursiveFooString) // "() => { alert(1) }"
如果你有任何想法可以完成类似于“recursiveToString”这样的操作,请告诉我。
eval
将这些函数转换为字符串(需要在相同的作用域)。 - nick zoum