【问题标题】:Javascript calling eval on an object literal (with functions)Javascript 在对象文字上调用 eval(带函数)
【发布时间】:2012-02-15 11:35:05
【问题描述】:

免责声明:我完全理解使用 eval 的风险/缺点,但这是一个我找不到其他方法的小众案例。

在 Google Apps 脚本中,仍然没有将脚本作为库导入的内置功能,因此许多工作表可以使用相同的代码;但是,一个内置的工具,我可以从纯文本文件中导入文本。

这是评估代码:

var id = [The-docID-goes-here];
var code = DocsList.getFileById(id).getContentAsString();
var lib = eval(code);
Logger.log(lib.fetchDate());

这是我在外部文件中使用的一些示例代码:

{
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
}

我的目标是将一个大对象文字(包含所有库代码)放到一个局部变量上,这样我就可以引用它的属性/函数,就像它们包含在自己的命名空间中一样。

【问题讨论】:

  • @AbePetrillo 可以直接读入对象文字并对其进行评估。如果是这样,怎么做?答案是肯定的;通过将对象包装在括号中,它可以被评估为匿名函数,该函数以可以分配给变量的方式返回对象文字。这是一种 hackish 解决方法,但我试图找到一种方法来导入 Google Apps 脚本。

标签: javascript import eval google-apps-script


【解决方案1】:

var lib = eval(code); 替换为:

var lib = eval('(' + code + ')');

当省略括号时,花括号被解释为代码块的标记。因此,eval 的返回值是fetchData 函数,而不是包含该函数的对象。

当缺少函数名时,块内的代码被读取为标记匿名函数语句,这是无效的。

添加括号后,花括号用作对象字面量(如预期的那样),eval 的返回值是一个对象,使用fetchData 方法。然后,你的代码就可以工作了。

【讨论】:

  • 实际上没有括号,eval 的值是错误的,因为 fetchData: value 被解释为标签,而匿名函数表达式不是标签的有效值。
  • 不,这完美无缺。我应该想到 Stack Overflow 上的某个人会知道 eval 的细节。我想知道为什么 toString 从 eval 中返回一个 [function]。谢谢!
【解决方案2】:

你无法评估

{
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
}

因为它不是一个有效的表达式(对象文字本身被解释为块。fetch: function () { } 不是一个有效的表达式)。

试试

var myLibName = {
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
};

【讨论】:

  • +1 您的解决方案运行良好,但我正在努力做到这一点,以便在调用 eval 的位置可配置命名空间。无论如何,谢谢,也许这对其他人有帮助。
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多