编辑:明确地说,我不是在寻找有关功能所暗示的各种问题的定性值(value)的建议或意见——我也不是在寻找实际问题的可靠解决方案;我只是在寻找标题中问题的技术性、可验证的答案。我已将问题附加到不符合要求的浏览器列表中。
使用函数的 .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
不合格浏览器列表:最佳答案
What current Javascript engines don't behave this way?
鉴于您尚未定义“流行”,您的问题并没有真正明确定义。 IE6流行吗? IE5? IE4?网景导航器?猞猁?正确回答您的问题的唯一方法是枚举您希望支持的浏览器并检查它们。不幸的是 kangax 的 table http://kangax.github.io/es5-compat-table/#不测试 Function.prototype.toString
Chrome's console will even tell you (when you pass anything other than a function o Function.toString.call), that Function.prototype.toString is not generic
规范中规定的
the spec refrains from making any commitment as to what the behaviour should be when applied to functions
所需的行为在 ECMA-262 版本 1 中指定(从 1997 年开始,http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%201st%20edition,%20June%201997.pdf)你必须追查它:
由此,我们推断函数是对象。
那么现在什么是 ToPrimitive?
所以我们需要知道 DefaultValue 是做什么的
现在我们只需要找到 Function.prototype.toString 的描述位置:
因此,您可以保证获得正确的 javascript 表示形式(不是一些 IL gobbledegook),但不一定带有注释。例如,该技术在 Firefox 16 中中断(但您必须询问它是否是最新的)。
关于javascript - Function.prototype.toString 在哪些 Javascript 引擎中不返回该函数的源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16937940/