javascript - Function.prototype.toString 在哪些 Javascript 引擎中不返回该函数的源代码?

标签 javascript interpreter

编辑:明确地说,我不是在寻找有关功能所暗示的各种问题的定性值(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
不合格浏览器列表:
  • 火狐 16
  • 最佳答案

    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)你必须追查它:
  • http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.24 “函数 ... Object 类型的成员,它是标准内置 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 的语法。请特别注意,表示字符串中空格、行终止符和分号的使用和放置取决于实现。”

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

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

    相关文章:

    javascript - Visual Studio Code 中是否有 "immediate window"来运行 Javascript?

    javascript - Brainfuck解释器的错误行为

    java - 使用监听器的 ANTLR 4 解释器

    javascript - 在 Firefox 中单击桌面通知时如何将焦点放在选项卡上?

    javascript - 从 Ext JS 4.2 调用 aspx 时遇到问题

    javascript - 可以使用 JavaScript 捕获窗口/选项卡关闭吗?

    值的 Ocaml 表示 - Atoms

    javascript - 查找 HTML 文本并将其替换为 JavaScript

    javascript - 如何限制每次从 ReadableStream 读取的大小

    java - 解释 Java 并将其转换为另一种语言