执行任意表达式的exec函数(new Function)

在开发前端框架、模版引擎的时候,经常会需要我们在特定的上下文中,动态分析、执行特定的表达式。例如:在 { x: 1, y: 2, z: 3 } 的上下文中执行表达式 x + y 那么就会得到 3,执行 z - x 就会得到 2。

请你完成 exec 函数,接受一个字符串和对象作为参数,它可以在特定的上下文中执行任意的表达式,例如:

execute('My name is ' + name, { name: 'Jerry' }) // => My name is Jerry
execute('monkeys.length + 1', { monkeys: [1, 2, 3] }) // => 4
execute('user.name + user.age', { user: { name: 'Jerry', age: 12 } }) // => Jerry12
execute('run()', { run: () => 'Good Night' }) // => Good Night

答案
这道面试题我写了三个多小时正则,发现虽然可以执行出一两个结果,但是想要执行任意表达式,无论如何也做不到,然后去请教答案。发现只有四行。惊了,这个周末过的体验极差。。。

new Function允许将字符串转换为函数,函数是由在运行时传入的字符串创建的,应该在变量和参数都不确定的情况下使用,所以他唯一的用处就是解决模板动态编译问题,答案中用 ...values替换...keys,由于...keys在str字符串中是以变量的形式存在,所以所有变量直接被替换成值返回。

const execute = function(str, ctx) {
  const keys = Object.keys(ctx)
  const values = Object.values(ctx)
  const func = new Function(...keys, `return ${str}`)
  return func(...values)
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容