Ответ 1
Какие текущие двигатели Javascript не ведут себя таким образом?
Ваш вопрос не совсем определен, учитывая, что вы не определили "популярность". Популярен ли IE6? IE5? IE4? Netscape Navigator? Рысь? Единственный способ ответить на ваш вопрос - перечислить, какие браузеры вы хотите поддержать и проверить. К сожалению, таблица kangax http://kangax.github.io/es5-compat-table/# не тестирует функцию .prototype.toString
Консоль Chrome даже скажет вам (когда вы передаете что-либо, кроме функции o Function.toString.call), что Function.prototype.toString не является общим
указанный в спецификации
спецификация воздерживается от принятия каких-либо обязательств относительно того, какое поведение должно быть при применении к функциям
Требуемое поведение указано в ECMA-262 версии 1 (с 1997 года, http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf). Вы должны преследовать его:
- http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.24 "... член типа Object, являющийся экземпляром стандартного встроенного конструктора функций и который может быть вызван как подпрограмма"
Из этого мы выводим, что функции являются объектами.
- http://www.ecma-international.org/ecma-262/5.1/#sec-9.8 "Пусть primValue будет ToPrimitive (входной аргумент, подсказка String)."
Итак, что такое ToPrimitive?
- http://www.ecma-international.org/ecma-262/5.1/#sec-9.1 "Значение по умолчанию для объекта извлекается, вызывая внутренний метод [[DefaultValue]] объекта, передавая необязательный подсказку PreferredType."
Итак, нам нужно знать, что делает DefaultValue
- http://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8 (много слов, которые в основном говорят, если вещь имеет метод toString, затем назовите ее)
Теперь нам просто нужно найти, где описано Function.prototype.toString:
- http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.2 "Возвращаемое по реализации представление функции возвращается. Это представление имеет синтаксис FunctionDeclaration. Обратите внимание, в частности, что использование и размещение пустое пространство, ограничители строк и точки с запятой в представлении Строка зависит от реализации."
Итак, вам гарантировано, что вы получите правильное представление javascript (а не некоторый IL gobbledegook), но не обязательно с комментариями. Например, техника ломается в Firefox 16 (но тогда вы должны спросить, является ли она текущей).