2015-01-17 2 views
3

С EcmaScript 5 specificationПочему функция toString JavaScript зависит от реализации?

15.3.4.2 Function.prototype.toString()

зависящих от реализации представления функции возвращаются. Это представление имеет синтаксис FunctionDeclaration. Обратите внимание, в частности, что использование и размещение пробелов, ограничителей строк и точек с запятой в представлении String зависит от реализации.

Почему зависит от реализации? Не должно быть слишком сложно сделать вывод стандартизованной строки, состоящей из исходного кода функции. Также причины, которые я могу придумать, такие как оптимизация, похоже, не слишком сильно используются, поскольку почти все браузеры дают исходный код в результате toString.

Если toString не зависит от реализации и, следовательно, будет стандартизован как исходный код для функции (с новыми строками и т. Д., Обрабатываемый стандартным образом), не позволит ли оно включить функции на JSON?

Я действительно понимаю, что JSON, несмотря на его имя, не зависит от JavaScript и, следовательно, функции не должны быть его частью. Но таким образом функции теоретически могут передаваться с ним как строки, не теряя при этом кросс-браузерной поддержки.

+0

[* specification says *] (http://ecma-international.org/ecma-262/5.1/#sec-15.3.4.2) "* Это представление имеет синтаксис FunctionDeclaration *", поэтому результат все равно должны быть синтаксически правильными. Часть, зависящая от реализации, относится только к пробелу и т. Д. – RobG

+1

@ RobG: Я предполагаю, что вы правы в этом. Результатом является исполняемая функция для других функций, чем те, которые содержат собственный код, такой как _alert_. Фактический прецедент, который впервые привел меня сюда, - это использование этого для инъекции зависимости, например, [AngularJS] (https://github.com/angular/angular.js/blob/dde1b2949727c297e214c99960141bfad438d7a4/src/auto/injector.js # L63-L96). Многочисленные проблемы, связанные с этим, не являющиеся стандартными, описаны в статье [this] (http://perfectionkills.com/state-of-function-decompilation-in-javascript/). –

ответ

3

Внутренне, Function.prototype.toString() должен получить код объявления функции для функции, которая может иметь или не иметь. Согласно странице MDN, FF используется для декомпиляции функции, и теперь она сохраняет декларацию с помощью функции, поэтому ее не нужно декомпилировать.

С Gecko 17,0 (Firefox 17/Thunderbird 17/SeaMonkey 2.14), Function.prototype.toString() реализуется за счет экономии источника в функции. Декомпилятор был удален

* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString

Декомпиляция это требует дополнительной работы. Для его хранения требуется дополнительная память. Реализация ECMAscript может иметь разные требования к ресурсам.

Кроме того, если он декомпилирован, это зависит от того, как оно было сохранено в первую очередь. Двигатель может быть неспособен вернуть комментарии в оригинале, потому что он не хранил их при проверке функции. Или пробелы/символы новой строки могут отличаться, если двигатель обрушивает их. Или двигатель может оптимизировать код, например, игнорируя unreachable code, что делает невозможным возвращение этого кода обратно в вызов toString().

... некоторые двигатели опускают символы перевода строки. И другие опускают комментарии. И другие опустить «мертвый код». И другие включают комментарии вокруг (!) Функции. И другие скрывают источник полностью ...

* http://perfectionkills.com/state-of-function-decompilation-in-javascript/

Это всего лишь несколько причин, почему Function.prototype.toString() зависит от реализации.

Смежные вопросы