Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript函数的toString依赖于实现?_Javascript_Json_Ecmascript 5 - Fatal编程技术网

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

为什么JavaScript函数的toString依赖于实现?,javascript,json,ecmascript-5,Javascript,Json,Ecmascript 5,从 15.3.4.2 Function.prototype.toString() 返回函数的依赖于实现的表示形式。此表示具有FunctionDeclaration的语法。请特别注意,表示字符串中空格、行终止符和分号的使用和放置取决于实现 为什么它依赖于实现?要让它输出由函数的原始代码组成的标准化字符串应该不会太难。另外,我能想到的一些原因,比如优化,似乎没有被大量使用,因为几乎所有的浏览器都提供了原始代码作为toString的结果 如果toString不依赖于实现,因此会被标准化为函数的原始代码

15.3.4.2 Function.prototype.toString()

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

为什么它依赖于实现?要让它输出由函数的原始代码组成的标准化字符串应该不会太难。另外,我能想到的一些原因,比如优化,似乎没有被大量使用,因为几乎所有的浏览器都提供了原始代码作为toString的结果

如果toString不依赖于实现,因此会被标准化为函数的原始代码(新行等以标准方式处理),那么它不可能在JSON上包含函数吗


我确实意识到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)的函数外,其他函数的可执行函数。第一次带我到这里的实际用例是,例如,在中使用它进行依赖项注入。本文描述了与此不标准相关的多个问题。