Javascript在对象文本上调用eval(带函数)

Javascript在对象文本上调用eval(带函数),javascript,import,eval,google-apps-script,Javascript,Import,Eval,Google Apps Script,免责声明:我完全理解使用eval的风险/缺点,但这是一个利基案例,我找不到任何其他方法 在GoogleApps脚本中,仍然没有内置的将脚本作为库导入的功能,因此许多工作表可以使用相同的代码;但是,有一个内置的工具,我可以从纯文本文件导入文本 以下是评估代码: var id = [The-docID-goes-here]; var code = DocsList.getFileById(id).getContentAsString(); var lib = eval(code); Logger.l

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

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

以下是评估代码:

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;
  }
}

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

Replace
var lib=eval(code)带有:

var lib = eval('(' + code + ')');
当省略paren时,大括号将被解释为代码块的标记。因此,
eval
的返回值是
fetchData
函数,而不是包含该函数的对象

当函数名丢失时,块内的代码将作为带标签的匿名函数语句读取,这是无效的

在添加paren之后,大括号被用作对象文本(如预期的那样),并且
eval
的返回值是一个对象,使用
fetchData
方法。然后,您的代码将工作。

您无法计算

{
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
}
因为它不是有效的表达式(对象文字本身被解释为块。fetch:function(){}不是有效的表达式)

试一试


实际上,如果没有parens,eval的值是一个错误,因为
fetchData:value
被解释为标签,而匿名函数表达式不是标签的有效值。不,这是完美的。我应该想到,堆栈溢出上的某个人会知道eval的细节。我想知道为什么toString会从eval返回一个[函数]。谢谢+1您的解决方案工作得很好,但我正在尝试使其能够在调用eval的位置配置名称空间。无论如何,谢谢你,也许这会帮助其他人。@Abepertillo可以直接读取和评估对象文字。如果是,怎么做?答案是肯定的;通过将对象包装在括号中,可以将其作为匿名函数进行计算,该函数以可以指定给变量的方式返回对象文本。这是一种黑客的解决方法,但我试图找到一种在谷歌应用程序脚本中导入的方法。
var myLibName = {
  fetchDate: function() {
    var d = new Date();
    var dateString = (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear();
    return dateString;
  }
};