JavaScript ES6:测试箭头函数、内置函数、常规函数?

2023-11-26

有没有一种优雅的方式来区分 Harmony 的细长箭头函数与常规函数and内置函数?

The 和谐维基指出:

箭头函数就像内置函数一样缺乏原型以及任何 [[Construct]] 内部方法。所以 new (() => {}) 会抛出 TypeError 但除此之外箭头就像函数

这意味着,您可以测试箭头函数,例如:

!(()=>{}).hasOwnProperty("prototype") // true
!(function(){}).hasOwnProperty("prototype") // false

但测试也会回归true对于任何内置函数,例如setTimeout or Math.min.

如果你获取源代码并检查它是否可以在 Firefox 中运行,它就可以了"native code",但它似乎不太可靠也不太可移植(其他浏览器实现,NodeJS / iojs):

setTimeout.toSource().indexOf("[native code]") > -1

小型 GitHub 项目节点是箭头函数依赖于正则表达式对函数源代码进行检查,这并不是那么简洁。

edit:我给了 JavaScript 解析器acorn尝试了一下,似乎效果很好——尽管它有点矫枉过正。

acorn = require("./acorn");

function fn_sample(a,b){
    c = (d,e) => d-e;
    f = c(--a, b) * (b, a);
    return f;
}

function test(fn){
    fn = fn || fn_sample;
    try {
        acorn.parse("(" + fn.toString() + ")", {
            ecmaVersion: 6,
            onToken: function(token){
                if(typeof token.type == "object" && token.type.type == "=>"){
                    console.log("ArrowFunction found", token);
                }
            }
        });
    } catch(e) {
        console.log("Error, possibly caused by [native code]");
        console.log(e.message);
    }
}

exports.test = test;

信不信由你...

测试函数的字符串表示形式中是否存在“=>”可能是最可靠的方法(但不是 100%)。

显然,我们无法针对您提到的两个条件中的任何一个进行测试 - 缺乏原型属性和缺乏[[Construct]]因为这可能会对主机对象或缺少的内置对象产生误报[[Construct]] (Math.floor, JSON.parse, etc.)

然而,我们可以使用旧的Function.prototype.toString检查函数表示是否包含“=>”。

现在我一直推荐against using Function.prototype.toString(所谓的函数反编译)由于其依赖于实现且历史上不可靠的性质(更多详细信息,请参阅Javascript 中函数反编译的状态).

但ES6实际上尝试执行规则在这种方式上(至少)内置和“用户创建的”(由于缺乏更好的术语)函数被表示。

  1. 如果 Type(func) 是 Object 并且是内置函数对象或有一个 [[ECMAScriptCode]] 内部插槽, then

    A。返回 func 的依赖于实现的 String 源代码表示。代表性必须符合以下规则.

...

toString 表示要求:

  • 字符串表示形式必须具有 FunctionDeclaration FunctionExpression、GeneratorDeclaration、 生成器表达式、类声明、类表达式、箭头功能, MethodDefinition 或 GeneratorMethod 取决于实际情况 对象的特征。

  • 表示字符串中空格、行终止符和分号的使用和放置是 取决于实施。

  • 如果对象是使用 ECMAScript 代码定义的,并且返回的字符串表示形式不是 MethodDefinition 或 GeneratorMethod 那么表示必须是这样的,如果 使用 eval 在词法上下文中评估字符串 相当于用于创建原始对象的词汇上下文, 它将产生一个功能相同的新对象。在这种情况下 返回的源代码不得随意提及任何变量 原始函数的源代码没有自由提及,甚至 如果这些“额外”名称最初在范围内。

  • 如果实现无法生成满足这些条件的源代码字符串,那么它必须返回一个 eval 将抛出的字符串 语法错误异常。

我突出显示了相关的块。

箭头函数有内部[[ECMAScriptCode]](您可以从 14.2.17 — 箭头函数的评估 — 跟踪到函数创建 to 函数初始化).

这意味着他们必须符合箭头函数语法:

ArrowFunction[In, Yield] :
  ArrowParameters[?Yield] [no LineTerminator here] => ConciseBody[?In]

..这意味着他们必须有=>Function.prototype.toString的输出。

显然,您需要确保“=>”遵循 ArrowParameters 而不仅仅是 FunctionBody 中存在的内容:

function f() { return "=>" }

至于可靠性 - 请记住,目前任何/所有引擎都支持/可能不支持此行为,并且主机对象的表示可能出于某种原因而撒谎(尽管规范做出了努力)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript ES6:测试箭头函数、内置函数、常规函数? 的相关文章

随机推荐

  • 仅对 Bash 中的文件进行通配

    我在 Bash 中的 glob 方面遇到了一些麻烦 例如 echo 这将打印出当前目录中的所有文件和文件夹 例如 文件1 文件2 文件夹1 文件夹2 echo 这将打印出名称后带有 的所有文件夹 例如 文件夹1 文件夹2 我如何才能仅获取文
  • 迈耶斯单例的破坏顺序

    到下面的代码 class C public static C Instance static C c return c C std cout lt lt c destructed n private C class D similar to
  • Microsoft.mshtml.dll 重新分发问题 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我制作了一个在内部使用 Microsoft mshtml dll 的 C BHO 现在要打包这个 BHO 我还需要分发 Microsoft mshtml dll 将此 dll 添加到
  • QML 通过 id 锚定到 ApplicationWindow 不起作用

    我测试了一个简单的 QML Qt sdk 版本 5 3 2 程序 如下所示 import QtQuick 2 3 import QtQuick Controls 1 2 ApplicationWindow visible true widt
  • C# Main() 方法的默认访问修饰符

    我在 vs2010 中创建了一个示例类 通过类视图 我看到 Main 的默认访问修饰符是内部的 我还看到有人说 Main 的默认访问修饰符是 隐式私有 Visual Studio 2010 自动将程序的 Main 方法定义为隐式私有方法 这
  • 如何从django框架中的表单字段获取值?

    如何从 django 框架中的表单字段获取值 我想在视图中执行此操作 而不是在模板中 在视图中使用表单几乎可以解释它 在视图中处理表单的标准模式如下所示 def contact request if request method POST
  • 如何使 SqlDataReader.ReadAsync() 异步运行?

    当调用 SQL Server 实际上执行需要时间的操作时 SqlDataReader ReadAsync 为我同步运行 有什么方法可以强制它异步运行 或者是我调用它的唯一选择Task Run 这是一个复制品 它使用 winforms 来演示
  • 正则表达式获取匹配字符串后的单词

    以下为内容 Subject Security ID S 1 5 21 3368353891 1012177287 890106238 22451 Account Name ChamaraKer Account Domain JIC Logo
  • 测试 child_process.exec 标准输出

    我正在尝试用摩卡测试子进程的输出 我的测试如下所示 var should require should exec require child process exec describe users function describe and
  • 如何检测 3D 空间中的点是否位于圆锥体内?

    如何检测 3D 点是否在圆锥体内 Ross cone x1 y1 h1 Cone angle alpha Height of the cone H Cone radius R Coordinates of the point of the
  • 单击网站上的按钮然后抓取网页

    我有一个网站 我想单击一个按钮 然后使用 python 抓取该网站 按钮之间的 html 代码是 span class exchange input nav link Testing span 这可能吗 我可以从页面中抓取我需要的所有数据
  • 从字符串末尾删除
    标签的最佳方法是什么?

    我正在开发的 NET Web 系统允许最终用户在某些情况下输入 HTML 格式的文本 在其中一些地方 我们希望保留所有标签 但去掉任何尾随的分隔符标签 但在文本正文中保留任何分隔符 最好的方法是什么 我可以想出一些方法来做到这一点 但我确信
  • 如何在 iPhone 中比较当前日期和前一个日期?

    我想将当前日期与另一个日期进行比较 如果该日期早于当前日期 那么我应该停止下一步操作 我怎样才能做到这一点 我今天的日期是yyyy MM dd格式 我需要检查这个情况 if displaydate text
  • 仅从关联数组中获取指定键的元素

    已经很晚了 我知道这是一个非常简单的问题 但现在我没有想法 而且截止日期已近 我有两个数组 array1 array a gt asdasd b gt gtrgrtg c gt fwefwefw d gt trhrtgr array2 ar
  • 获取应用内结算购买中使用的 Google ID

    我注意到一台设备可能有多个 Google 帐户同时登录 据我所知 在Honeycomb之前 有一个主ID 从 Honeycomb 开始 您只需插入几个即可 我目前有两个 ID 登录到我的测试平板电脑中 从 Google Play 购买时 您
  • JSP页面已缓存,无法更改,tomcat

    我有一个java服务器 当我更改其中的某些内容时JSP代码 我从浏览器再次调用该页面 我的更改没有显示 服务器返回旧的JSP 任何人都知道为什么 贾斯珀指南告诉我们在conf web xml 为您org apache jasper serv
  • Python 脚本中出现错误“需要 2D 数组,却得到 1D 数组:”?

    我正在跟进本教程进行机器学习预测 import numpy as np import matplotlib pyplot as plt from matplotlib import style style use ggplot from s
  • 从字符串中删除所有出现的单词

    我有以下字符串 str toto1 toto2 toto3 toto4 toto2 toto5 the toto2在字符串中出现两次 我怎样才能删除所有toto2字符串中出现的次数 我试过这个 echo str toto2 但这只会删除第一
  • 获取两个表中几列的总和

    我想从两个不同的表中获取几列的总和 这些表共享相同的结构 如果我只考虑一张表 我会编写这种查询 SELECT MONTH REF SUM amount1 SUM amount2 FROM T FOO WHERE seller XXX GRO
  • JavaScript ES6:测试箭头函数、内置函数、常规函数?

    有没有一种优雅的方式来区分 Harmony 的细长箭头函数与常规函数and内置函数 The 和谐维基指出 箭头函数就像内置函数一样缺乏原型以及任何 Construct 内部方法 所以 new gt 会抛出 TypeError 但除此之外箭头