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

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

12 голосов
/ 21 января 2012

Заменить var lib = eval(code); на:

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

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

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

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

2 голосов
/ 21 января 2012

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

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