为什么JavaScript函数的toString依赖于实现?
从 15.3.4.2 Function.prototype.toString() 返回函数的依赖于实现的表示形式。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中空格、行终止符和分号的使用和放置取决于实现 为什么它依赖于实现?要让它输出由函数的原始代码组成的标准化字符串应该不会太难。另外,我能想到的一些原因,比如优化,似乎没有被大量使用,因为几乎所有的浏览器都提供了原始代码作为toString的结果 如果toString不依赖于实现,因此会被标准化为函数的原始代码(新行等以标准方式处理),那么它不可能在JSON上包含函数吗为什么JavaScript函数的toString依赖于实现?,javascript,json,ecmascript-5,Javascript,Json,Ecmascript 5,从 15.3.4.2 Function.prototype.toString() 返回函数的依赖于实现的表示形式。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中空格、行终止符和分号的使用和放置取决于实现 为什么它依赖于实现?要让它输出由函数的原始代码组成的标准化字符串应该不会太难。另外,我能想到的一些原因,比如优化,似乎没有被大量使用,因为几乎所有的浏览器都提供了原始代码作为toString的结果 如果toString不依赖于实现,因此会被标准化为函数的原始代码
我确实意识到JSON,尽管它的名字,是独立于JavaScript的,因此函数不应该是它的一部分。但这种方法理论上可以将函数作为字符串传递,而不会失去跨浏览器支持。在内部,
Function.prototype.toString()
必须获取函数的函数声明代码,它可能有也可能没有。根据MDN页面,FF用于反编译函数,现在它将声明与函数一起存储,因此不必反编译
自Gecko 17.0(Firefox 17/Thunderbird 17/SeaMonkey 2.14)以来,
已通过保存
函数的源代码。反编译程序已被删除
*
反编译它需要额外的工作。存储它需要额外的内存。给定的ECMAscript
实现可能有不同的资源需求
此外,如果它是反编译的,这取决于它最初的存储方式。引擎可能无法返回原始注释,因为它在计算函数时没有存储注释。或者,如果引擎将空格/换行符折叠,则它们可能会有所不同。或者引擎可能已经优化了代码,例如通过忽略无法访问的代码
,使得无法在toString()
调用中返回该代码
…有些引擎省略了换行符。而其他人则忽略了评论。及其他
省略“死代码”。其他包括(!)函数的注释。及
其他人完全隐藏了来源
*
这些只是
Function.prototype.toString()
依赖于实现的几个原因。由于“此表示具有FunctionDeclaration的语法”,因此结果在语法上必须仍然正确。依赖于实现的部分只涉及空白等方面@RobG:我想你是对的。结果是,除了包含本机代码(如alert)的函数外,其他函数的可执行函数。第一次带我到这里的实际用例是,例如,在中使用它进行依赖项注入。本文描述了与此不标准相关的多个问题。