【问题标题】:Is there a way to get the current function from within the current function?有没有办法从当前函数中获取当前函数?
【发布时间】:2011-01-11 05:07:30
【问题描述】:

很抱歉标题真的很奇怪,但这是我想要做的:

var f1 = function (param1, param2) {

    // Is there a way to get an object that is ‘f1’
    // (the current function)?

};

如您所见,我想从匿名函数中访问当前函数。

这可能吗?

【问题讨论】:

    标签: javascript function


    【解决方案1】:

    给它命名。

    var f1 = function fOne() {
        console.log(fOne); //fOne is reference to this function
    }
    console.log(fOne); //undefined - this is good, fOne does not pollute global context
    

    【讨论】:

    • 我想知道是谁投了反对票。这基本上就是在匿名函数中访问当前函数的方式。并且即使将其分配给另一个对象,名称也会保留,因此递归仍然是可能的。
    • @Markos——一个有名字的函数表达式不再是“匿名的”。 ;-)
    • @RobG 这只是术语。由于函数表达式上的名称仅用于函数内的代码,因此从外部角度来看,它基本上是匿名的。从外部可以看到名称的唯一地方是函数语句。
    • 我不确定我什么时候开始学习 JavaScript,但我知道这是正确答案。
    • 这个答案假设你知道你在哪个功能 - 在这种情况下它确实是微不足道的。但是,通常要求是在运行时找出你在哪个函数,用于调试、堆栈跟踪等目的,这种命名方式是没有用的。
    【解决方案2】:

    是的——arguments.callee 是当前函数。

    注意:这在 ECMAScript 5 中已弃用,可能会导致尾调用递归等性能下降。但是,它确实适用于大多数主流浏览器。

    在你的情况下,f1 也可以。

    【讨论】:

    • arguments.callee 不适合这种情况。它在 ECMAScript 5“严格模式”中已被弃用,并阻止缩小器进行某些优化。
    • @Box9 有替代方案吗?
    • @DavidTang 它可能已被弃用,但它是唯一可用的选项。也许他们应该取消它。
    • 请注意,这在使用“严格模式”时不起作用。
    • arguments.callee 在您对许多函数进行大量剪切和粘贴工作时非常有用,其中命名函数需要大量手动更新。如果您曾经重构代码也会更安全,因为您现在引用错误函数的风险会大大降低。
    【解决方案3】:

    您可以使用f1 访问它,因为该函数将被分配给变量f1 在调用之前

    var f1 = function () {
        f1(); // Is valid
    };
    
    f1(); // The function is called at a later stage
    

    【讨论】:

    • ...这很奇怪,但很有用。但是,对于(模棱两可的)问题,这并不是一个合适的答案,因为 George 想在 anonymous 函数中递归。
    • @Christian,一点也不奇怪。函数声明和函数执行是两个完全不同的东西。而且我相信这 is 是 OP 问题的更正确解决方案 - var f1 = function () {} 是一个匿名函数。 function f1() {} 不是。请参阅 stackoverflow.com/questions/103598/… 了解为什么应该避免使用 arguments.callee
    • 啊,我明白了。很奇怪,因为 Function 对象在定义时还没有完全构建,因此(在我看来)没有分配给 f1。我认为 George 想要在匿名函数中递归,比如在 JQuery 事件处理程序或其他东西中。
    • @ChristianMann 这很有意义,因为仅在调用函数时才使用引用,而不是定义。这也可以: var x = function() {console.log(y);}; var y = '测试';
    • 这些会起作用,但出于不同的原因——函数何时被调用与它无关。 JavaScript 有一个词法作用域,所以所有被关闭的引用都会在定义站点被固化!它起作用的真正原因是变量定义是函数范围的,稍后定义的东西只是语法糖。所以当闭包创建时,裁判已经存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多