编辑:明确地说,我不是在寻求有关功能所隐含的各种问题的定性优点的建议或意见–我也不是在寻找针对实际问题的可靠解决方案;我只是在寻找标题中问题的技术性且可验证的答案。我在问题中附加了不合格的浏览器列表。
使用函数的.toString方法通常为render the source code for that function。问题在于这种行为isn't specified(规范)拒绝做出任何将行为应用于函数时的 promise 。 Chrome的控制台甚至会告诉您(当您将函数以外的任何内容传递给Function.toString.call时),Function.prototype.toString不是通用的
This blog post建议将此方法用作为多行字符串生成可读语法的方法(通过将字符串作为多行注释存储在a no-op function主体中)。作者建议在编写Node.js应用程序的上下文中使用此用法,并声明该行为仅是可靠的,因为Node.js在受控环境中运行。但是,在Javascript的本机网络中,任何东西都可以出现并对其进行解释,我们不应该依赖未指定的行为。
不过实际上,I've set up a fiddle呈现一个选择框,其内容由大的多行字符串确定,以测试代码,并且我工作站上的每个浏览器(Chrome 27,Firefox 21,Opera 12,Safari 5,Internet Explorer 8)都将执行如预期。
当前哪些Javascript引擎无法正常运行?
鉴于:

function uncomment(fn){
  return fn.toString().split(/\/\*\n|\n\*\//g).slice(1,-1).join();
}
以下:
uncomment(function(){/*
erg
arg
*/});
应该输出:
erg
arg
不符合要求的浏览器列表:
  • Firefox 16
  • 最佳答案



    鉴于您尚未定义“热门”,因此您的问题定义不是很明确。 IE6受欢迎吗? IE5? IE4? Netscape Navigator?天猫?正确回答问题的唯一方法是枚举您要支持的浏览器并进行检查。不幸的是kangax的表http://kangax.github.io/es5-compat-table/#不测试Function.prototype.toString



    规范中规定



    所需的行为在ECMA-262版本1中指定(从1997年开始,http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf),您必须将其追逐:

  • http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.24“对象类型的function ...成员,它是标准内置Function构造函数的实例,可以作为子例程调用”

    由此,我们推断出函数是对象。

  • http://www.ecma-international.org/ecma-262/5.1/#sec-9.8”让primValue为ToPrimitive(输入参数,提示字符串)。

  • 那么,什么是ToPrimitive?

  • http://www.ecma-international.org/ecma-262/5.1/#sec-9.1”通过调用对象的[[DefaultValue]]内部方法并传递可选提示PreferredType来检索对象的默认值。

    所以我们需要知道DefaultValue的作用
  • http://www.ecma-international.org/ecma-262/5.1/#sec-8.12.8(很多单词,基本上说如果事物具有toString方法,则将其调用)

  • 现在我们只需要找到描述Function.prototype.toString的位置:
  • http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.2“返回函数的与实现相关的表示形式。此表示形式具有FunctionDeclaration的语法。尤其要注意,表示形式String中空格和行终止符和分号的使用和放置取决于实现。”

  • 因此,您可以确保获得正确的javascript表示形式(不是某些IL gobbledegook),但不一定带有注释。例如,该技术在Firefox 16中失效(但随后您必须询问它是否是最新的)。

    关于javascript - 在哪些Javascript引擎中Function.prototype.toString不返回该函数的源代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16937940/

    10-11 11:21