我如何“递归”将调用其他作用域函数的javascript函数字符串化?

问题描述 投票:3回答:1

因为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”的事情有任何想法

因为javascript函数不可序列化,为了有时(尽管很少)将它们传递到新的上下文中,所以将它们字符串化然后在以后重新评估它们可能是有用的,例如:const foo =()...

javascript recursion serialization tostring
1个回答
0
投票
唯一的[[good”方法是从父范围开始,该父范围包含最终引用的所有函数foo。例如,对于您的foobar,如果您想将foo传递到另一个上下文中,使得bar也可以被调用,则传递一个声明foobar的函数,然后返回foo。例如:
© www.soinside.com 2019 - 2024. All rights reserved.