С EcmaScript 5 specificationПочему функция toString JavaScript зависит от реализации?
15.3.4.2 Function.prototype.toString()
зависящих от реализации представления функции возвращаются. Это представление имеет синтаксис FunctionDeclaration. Обратите внимание, в частности, что использование и размещение пробелов, ограничителей строк и точек с запятой в представлении String зависит от реализации.
Почему зависит от реализации? Не должно быть слишком сложно сделать вывод стандартизованной строки, состоящей из исходного кода функции. Также причины, которые я могу придумать, такие как оптимизация, похоже, не слишком сильно используются, поскольку почти все браузеры дают исходный код в результате toString.
Если toString не зависит от реализации и, следовательно, будет стандартизован как исходный код для функции (с новыми строками и т. Д., Обрабатываемый стандартным образом), не позволит ли оно включить функции на JSON?
Я действительно понимаю, что JSON, несмотря на его имя, не зависит от JavaScript и, следовательно, функции не должны быть его частью. Но таким образом функции теоретически могут передаваться с ним как строки, не теряя при этом кросс-браузерной поддержки.
[* specification says *] (http://ecma-international.org/ecma-262/5.1/#sec-15.3.4.2) "* Это представление имеет синтаксис FunctionDeclaration *", поэтому результат все равно должны быть синтаксически правильными. Часть, зависящая от реализации, относится только к пробелу и т. Д. – RobG
@ 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/). –