【问题标题】:Javascript - eval in context/scope without using this keyword without with statementJavascript - 在上下文/范围内进行 eval 不使用 this 关键字而不使用 with 语句
【发布时间】:2019-01-12 20:50:27
【问题描述】:

这篇文章提供了一个解决方案,说明如何在特定上下文/范围内使用 eval,而不必在 eval 代码中的所有变量/函数前面加上 thisjavascript eval in context without using this keyword

澄清一下 - 假设我有以下对象作为 eval 语句 {dog: "labrador"} 的上下文。我希望console.log(eval(dog)) 输出“拉布拉多”而不必输入eval(this.dog)

但是,链接帖子中的解决方案:

function evalInContext(scr, context)
{
    // execute script in private context
    return (new Function( "with(this) { return " + scr + "}")).call(context);
}

使用with 语句。考虑到不鼓励使用 with 语句,是否有替代解决方案?

【问题讨论】:

  • 你为什么要使用这个功能?它看起来像是一种冗长、危险且低效的写作方式:context[scr]
  • 抱歉,该函数取自链接的 SO 帖子,作为在特定上下文中使用 eval 时如何在不执行 this.dog 的情况下引用 dog 的示例。我没有使用那个功能。
  • 我还是不明白你试图用 eval 解决的问题
  • 请详细说明。 context[scr] 确实回应了您的“如果我有一个对象......那么我将能够......没有this.dog”。那么问题出在哪里?
  • @Roymunson - 这并没有真正澄清事情。你为什么首先评估代码? evalwith 更加气馁。

标签: javascript scope eval with-statement


【解决方案1】:

有其他解决方案吗?

当然,但那比with 更糟糕:

 return new Function(...Object.keys(context), scr)(...Object.values(context));

【讨论】:

  • 有趣,这是如何工作的?我知道... 是扩展符号——但我不确定这个表达式是如何执行代码的,因为没有调用eval。还有为什么这会比with 更糟?
  • @roymunson 它创建了一个带有几个参数的函数,然后调用该函数并传入参数。它比 eval 更糟糕,因为没有人会理解它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多