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