编辑:明确地说,我不是在寻求有关功能所隐含的各种问题的定性优点的建议或意见–我也不是在寻找针对实际问题的可靠解决方案;我只是在寻找标题中问题的技术性且可验证的答案。我在问题中附加了不合格的浏览器列表。
使用函数的.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
不符合要求的浏览器列表:最佳答案
鉴于您尚未定义“热门”,因此您的问题定义不是很明确。 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),您必须将其追逐:
由此,我们推断出函数是对象。
“
那么,什么是ToPrimitive?
“
所以我们需要知道DefaultValue的作用
现在我们只需要找到描述Function.prototype.toString的位置:
因此,您可以确保获得正确的javascript表示形式(不是某些IL gobbledegook),但不一定带有注释。例如,该技术在Firefox 16中失效(但随后您必须询问它是否是最新的)。
关于javascript - 在哪些Javascript引擎中Function.prototype.toString不返回该函数的源代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16937940/