【问题标题】:Is there a way to name arrow functions in JavaScript?有没有办法在 JavaScript 中命名箭头函数?
【发布时间】:2015-03-26 00:07:40
【问题描述】:

我在应用程序中使用箭头函数,有时需要获取函数本身的引用。对于普通的 JavaScript 函数,我可以命名它们并从内部使用名称。对于箭头函数,我目前使用的是arguments.callee。有没有办法命名箭头函数以便可以从内部使用引用?

示例代码

// TypeScript
private evaluateIf(expr: parserModule.IIfExpression, callback: IEnvCallback) {
    this.evaluate(expr.condition, proceed => {
        guard(arguments.callee, arguments, this);
        if (proceed !== false) this.evaluate(expr.then, callback);
        else if (expr.else) this.evaluate(expr.else, callback);
        else callback(false);
    });
}

// JavaScript
Environment.prototype.evaluateIf = function (expr, callback) {
    var _this = this;
    this.evaluate(expr.condition, function (proceed) {
        guard(arguments.callee, arguments, _this);
        if (proceed !== false)
            _this.evaluate(expr.then, callback);
        else if (expr.else)
            _this.evaluate(expr.else, callback);
        else
            callback(false);
    });
};

在得到帮助后我决定做的事情,因为争论可能不会永远存在:

private evaluateIf(expr: parserModule.IIfExpression, callback: IEnvCallback) {
    var fn;
    this.evaluate(expr.condition, fn = proceed => {
        guard(fn, [proceed], this);
        if (proceed !== false) this.evaluate(expr.then, callback);
        else if (expr.else) this.evaluate(expr.else, callback);
        else callback(false);
    });
}

【问题讨论】:

  • 箭头函数的要点不就是表达匿名函数的一种更简洁的方式,加上正确的this绑定吗?因此,无论如何它们都不会具有与 JS 等效的名称。
  • 看起来你根本不需要箭头函数,而是一个命名函数表达式。
  • 不。实际上我想使用箭头功能,它们运行良好。但是,我正在实现一段代码(按照教程),它要求我将调用函数用作guarding 进程的一部分。我想知道如何避免使用arguments.callee,同时避免不得不将每个受影响的函数更改为普通的javascript函数。
  • 命名函数除了需要引用它们之外,对于堆栈跟踪也很方便

标签: javascript typescript arrow-functions


【解决方案1】:

有没有办法命名箭头函数,以便可以从内部使用引用?

除非您将其分配给变量,否则不会。例如:

var foo = () => {
    console.log(foo);
}

对于箭头函数,我目前使用arguments.callee

箭头函数不支持arguments。 TypeScript 当前错误地允许您使用它们。这将在下一版本的 TypeScript 中出现错误。 This is to keep TypeScript arrow functions compatible with the JavaScript Language Specification.

对于您的用例,我只会使用 function

【讨论】:

  • 哦,好的。所以我的代码现在可以工作了,因为 typescript 目前没有将它们转换为 es6。由于 typescript 将其转换为纯 javascript,有没有办法让它为它生成的函数分配一个名称?我有一些示例代码,因此将编辑问题并添加它,因为它的格式不正确
  • 对不起,我不清楚。 arguments 无论您针对的是哪个版本(es6、es5、es3),都会出错。我已经更新了答案
  • @ritcoder 我还添加了一个代码示例来解释分配给变量的含义
  • 谢谢。我不知道。我想我将不得不对这些部分使用普通函数。
  • 是的。就像在您的代码示例中一样,它实际上可以正常工作,因为我必须在函数外部声明一个变量才能使用它,但我没问题。我已经编辑了问题以显示更新的代码。
猜你喜欢
  • 2017-08-17
  • 2021-02-09
  • 2021-07-28
  • 2020-05-29
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
相关资源
最近更新 更多