JavaScript, использующий toString для объекта Function для чтения текстового содержимого

Вызов toString() для приведенной ниже функции возвращает разные строки в разных браузерах. Я понимаю, что это связано с тем, что ECMA-262 15.3.4.2 оставляет пространство для маневра для каждого поставщика.

Chrome возвращает комментарии в дополнение ко всему синтаксису. К сожалению, в Firefox 3.6 комментарии отсутствуют. Основываясь на поведении Firefox, я не тестировал IE, Opera или Safari.

function foo() {
    /* comment */
    var bar = true;
}

В частности, я пытаюсь встроить метаданные в специально отформатированный блок комментариев внутри функции. Позже возвращаемое значение метода функций toString() будет проанализировано, и значения будут возвращены в виде объекта.

Мне не удалось найти таблицы совместимости или альтернативы toString(). Есть ли у сообщества идеи? Кстати, предварительная обработка файлов JS невозможна. :(

Большое спасибо. :)


person mseeley    schedule 16.04.2010    source источник


Ответы (3)


Хотя это не так просто, как встраивание комментариев, поскольку функции являются первоклассными объектами в JS, вы можете указать для них произвольные свойства. Например.:

> function f(x) { return x * x; }
undefined
> f
function f(x) { return x * x; }
> f.comment = 'Hello'
Hello
> f.comment
Hello

Таким образом, вы можете встраивать метаданные в объекты функций чисто и переносимо.

person Max Shawabkeh    schedule 16.04.2010

Я пытался ответить на этот вопрос недавно, и наткнулся на это. Чтобы предоставить обновление, мне все еще не удалось найти таблицу совместимости, поэтому я создал следующую скрипту:

https://jsfiddle.net/deamvp7r/

if((function(){ /*test*/ }).toString().match('test').length === 0) {
    alert ("NO SUPPORT");   
} else {
     alert ("SUPPORTED");   
}

и проверил его вручную на BrowserStack. Что бы это ни стоило, вот браузеры, которые я тестировал, и то, что я нашел в отношении поддержки комментариев в Function.toString():

  • IE8–11: поддерживает комментарии.
  • Firefox ‹= 16 : НЕТ ПОДДЕРЖКИ
  • Firefox >= 17: поддерживает комментарии
  • Chrome 14+: поддерживает комментарии
  • Браузер IOS iPhone 3GS +: поддерживает комментарии
  • iPad 1+: поддержка комментариев
  • Android 2.3 (Galaxy) +: поддержка комментариев

Этот список явно далеко не исчерпывающий, поэтому будьте осторожны, если вам все еще нужно поддерживать старые/малоизвестные браузеры. Но процент популярных браузеров, поддерживающих комментарии, в настоящее время кажется довольно высоким.

person zero    schedule 18.04.2015

Функция «аннотации» — хорошее решение для того, что вы пытаетесь сделать. В настоящее время он реализован в Traceur (см. здесь). Аннотации используют синтаксис @ следующим образом:

@Anno('foo')
function func() {}

По существу это эквивалентно

function func() {}
func.annotate = [ new Anno('foo') ];

Аннотации также можно размещать в классах ES6.

Даже если вы не можете или не хотите использовать новый синтаксис аннотаций, добавление к функциям свойств, содержащих их метаданные, кажется лучшей идеей, чем встраивание таких метаданных в тело функции, будь то в виде комментариев или иным образом (одна идея — это что-то другое). аналогично "use strict"), а затем попытаться извлечь его, используя манипуляции со строками.

Функция аннотаций все еще находится на стадии обсуждения, и есть параллельные предложения по вариациям, называемым «декораторами» и т. д. Как вы, вероятно, знаете, сама концепция не нова и встречается в других языках, таких как Python, Java и C#. Аннотации рассматриваются для включения в языковые варианты, включая AtScript, TypeScript и ES7.

См. также аннотации JavaScript. Подход, основанный на анализе, см. на http://ariya.ofilabs.com/2014/04/tracking-javascript-annotations.html.

person Community    schedule 19.04.2015