有没有办法从当前函数中获取当前函数?

Nat*_*man 50 javascript function

抱歉这个非常奇怪的标题,但这就是我要做的事情:

var f1 = function (param1, param2) {

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

};
Run Code Online (Sandbox Code Playgroud)

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

这可能吗?

ami*_*mik 48

说出来.

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
Run Code Online (Sandbox Code Playgroud)

  • @ Markos-具有名称的函数表达式不再是"匿名".;-) (5认同)
  • 我想知道是谁贬低了这一点.这基本上是如何访问匿名函数中的当前函数.并且即使将名称分配给另一个对象,名称也会保留,因此仍然可以进行递归. (4认同)

Chr*_*ann 32

是 - arguments.callee是当前的功能.

注意:这在ECMAScript 5中已弃用,并且可能会导致尾调用递归等性能受到影响.但是,它在大多数主流浏览器中都有效.

在你的情况下,f1也将工作.

  • @ Box9有另一种选择吗? (16认同)
  • @DavidTang它可能会被弃用,但它是唯一可用的选项.也许他们应该弃用它. (5认同)
  • `arguments.callee`不适合这种情况.它在ECMAScript 5"严格模式"中被弃用,并且阻止了缩小器的某些优化. (3认同)
  • 当您在许多函数中执行大量剪切和粘贴工作时(其中命名该函数需要大量的手动更新),arguments.callee会非常有用。如果您曾经重构代码,也将更加安全,因为现在大大降低了您引用错误函数的风险。 (3认同)
  • 请注意,这在使用“严格模式”时不起作用。 (2认同)

Dav*_*ang 9

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

var f1 = function () {
    f1(); // Is valid
};

f1(); // The function is called at a later stage
Run Code Online (Sandbox Code Playgroud)

  • @Christian,一点儿都不奇怪.函数声明和函数执行是两个完全不同的东西.而且我相信这个*是OP问题的更正确的解决方案 - "var f1 = function(){}`是一个匿名函数.`function f1(){}`不是.请参阅http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript,了解为什么应该避免使用`arguments.callee`. (2认同)