15.3.4.2 Function.prototype.toString()
返回函数的依赖于实现的表示。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中的空格,行终止符和分号的使用和放置取决于实现。
为什么依赖于实现?使它输出由函数的原始代码组成的标准化字符串应该不会太难。此外,我可以提出的原因,如优化,似乎并没有太多使用,因为几乎所有的浏览器都提供原始代码作为 toString 的结果。
如果 toString 不依赖于实现,因此将标准化为功能的原始代码(使用标准方式处理新行等),不会可以在JSON上包含这些功能吗?
我确实认识到JSON尽管名称不同,但它不依赖于JavaScript,因此函数不应该是它的一部分。但是这样,理论上这些函数可以作为字符串传递,而不会失去跨浏览器的支持。
答案 0 :(得分: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()
依赖于实现的几个原因。