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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 19 апреля 2015

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

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: НЕТ ПОДДЕРЖКИ </li>
  • Firefox> = 17: поддержка комментариев
  • Chrome 14 +: поддержка комментариев
  • Браузер IOS iPhone 3GS +: поддержка комментариев
  • iPad 1 +: Поддержка комментариев
  • Android 2.3 (Galaxy) +: поддержка комментариев

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

1 голос
/ 16 апреля 2010

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

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

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

0 голосов
/ 19 апреля 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.

...