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

时间:2012-01-20 23:41:14

标签: javascript import eval google-apps-script

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

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

这是评估代码:

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

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

2 个答案:

答案 0 :(得分:12)

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

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

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

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

添加parens后,花括号用作对象文字(按预期),eval的返回值是一个对象,使用fetchData方法。然后,您的代码将起作用。

答案 1 :(得分: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;
  }
};