Javascript, вызывающий eval для литерала объекта (с функциями)

Отказ от ответственности: я полностью понимаю риски / недостатки использования 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;
  }
}

Я стремлюсь поместить большой объектный литерал (содержащий весь код библиотеки) в локальную переменную, чтобы я мог ссылаться на его свойства / функции, как если бы они содержались в их собственном пространстве имен.

2 ответа

Решение

Замещать var lib = eval(code); с:

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

Когда парены опущены, фигурные скобки интерпретируются как маркеры блока кода. В результате возвращаемое значение eval это fetchData функция, а не объект, содержащий функцию.

Когда имя функции отсутствует, код внутри блока читается как помеченный оператор анонимной функции, что недопустимо.

После добавления скобок фигурные скобки используются как литералы объекта (как и предполагалось), а возвращаемое значение eval является объектом, с fetchData метод. Тогда ваш код будет работать.

Вы не можете оценить

{
  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;
  }
};
Другие вопросы по тегам