为什么 JavaScript 函数的 toString 依赖于实现?
Why is toString of JavaScript function implementation-dependent?
15.3.4.2 Function.prototype.toString( )
An implementation-dependent representation of the function is returned. This representation has the syntax of a FunctionDeclaration. Note in particular that the use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent.
为什么 依赖于实现?让它输出由函数原始代码组成的标准化字符串应该不难。此外,我能想到的原因(例如优化)似乎并没有被过度使用,因为几乎所有浏览器都将原始代码作为 toString.[=13 的结果=]
如果 toString 不依赖于实现,因此将被标准化为函数的原始代码(新行等以标准方式处理),难道不能包含 JSON 上的功能吗?
我确实意识到 JSON 尽管它的名字是独立于 JavaScript 的,因此函数不应该是它的一部分。但是这样函数在理论上可以作为字符串传递给它,而不会失去跨浏览器支持。
在内部,Function.prototype.toString()
必须获取函数的函数声明代码,它可能有也可能没有。根据MDN页面,FF以前是反编译函数的,现在把声明和函数一起保存了,不用反编译了。
Since Gecko 17.0 (Firefox 17 / Thunderbird 17 / SeaMonkey 2.14),
Function.prototype.toString() has been implemented by saving the
function's source. The decompiler was removed
*https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString
反编译它需要额外的工作。存储它需要额外的内存。给定的 ECMAscript
实施可能有不同的资源要求。
此外,如果它被反编译,那首先取决于它是如何存储的。引擎可能无法 return 原始注释,因为它在计算函数时没有存储它们。或者 whitespace/newlines 如果引擎折叠它们可能会有所不同。或者引擎可能已经优化了代码,例如通过忽略 unreachable code
,使得无法 return 在 toString()
调用中返回该代码。
...some engines omit newlines. And others omit comments. And others
omit "dead code". And others include comments around (!) function. And
others hide source completely...
*http://perfectionkills.com/state-of-function-decompilation-in-javascript/
这些只是 Function.prototype.toString()
依赖于实现的几个原因。
15.3.4.2 Function.prototype.toString( )
An implementation-dependent representation of the function is returned. This representation has the syntax of a FunctionDeclaration. Note in particular that the use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent.
为什么 依赖于实现?让它输出由函数原始代码组成的标准化字符串应该不难。此外,我能想到的原因(例如优化)似乎并没有被过度使用,因为几乎所有浏览器都将原始代码作为 toString.[=13 的结果=]
如果 toString 不依赖于实现,因此将被标准化为函数的原始代码(新行等以标准方式处理),难道不能包含 JSON 上的功能吗?
我确实意识到 JSON 尽管它的名字是独立于 JavaScript 的,因此函数不应该是它的一部分。但是这样函数在理论上可以作为字符串传递给它,而不会失去跨浏览器支持。
在内部,Function.prototype.toString()
必须获取函数的函数声明代码,它可能有也可能没有。根据MDN页面,FF以前是反编译函数的,现在把声明和函数一起保存了,不用反编译了。
Since Gecko 17.0 (Firefox 17 / Thunderbird 17 / SeaMonkey 2.14), Function.prototype.toString() has been implemented by saving the function's source. The decompiler was removed
*https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString
反编译它需要额外的工作。存储它需要额外的内存。给定的 ECMAscript
实施可能有不同的资源要求。
此外,如果它被反编译,那首先取决于它是如何存储的。引擎可能无法 return 原始注释,因为它在计算函数时没有存储它们。或者 whitespace/newlines 如果引擎折叠它们可能会有所不同。或者引擎可能已经优化了代码,例如通过忽略 unreachable code
,使得无法 return 在 toString()
调用中返回该代码。
...some engines omit newlines. And others omit comments. And others omit "dead code". And others include comments around (!) function. And others hide source completely...
*http://perfectionkills.com/state-of-function-decompilation-in-javascript/
这些只是 Function.prototype.toString()
依赖于实现的几个原因。