为什么toString of JavaScript函数依赖于实现?

时间:2015-01-17 21:37:55

标签: javascript json ecmascript-5

来自EcmaScript 5 specification

  

15.3.4.2 Function.prototype.toString()

     

返回函数的依赖于实现的表示。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中的空格,行终止符和分号的使用和放置取决于实现。

为什么依赖于实现?使它输出由函数的原始代码组成的标准化字符串应该不会太难。此外,我可以提出的原因,如优化,似乎并没有太多使用,因为几乎所有的浏览器都提供原始代码作为 toString 的结果。

如果 toString 不依赖于实现,因此将标准化为功能的原始代码(使用标准方式处理新行等),不会可以在JSON上包含这些功能吗?

我确实认识到JSON尽管名称不同,但它不依赖于JavaScript,因此函数不应该是它的一部分。但是这样,理论上这些函数可以作为字符串传递,而不会失去跨浏览器的支持。

1 个答案:

答案 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()依赖于实现的几个原因。