有没有办法在javascript中获取当前正在执行的函数对象?

有没有办法在javascript中获取当前正在执行的函数对象?,javascript,Javascript,是否有任何方法可以引用当前正在执行的函数对象?如果它不是任何对象的方法,或者未使用.call()或.apply()调用,则此指针很可能只是窗口,而不是函数对象 我经常对全局变量使用这样的设计模式,我希望将其范围限定到特定的函数,因为这样可以将它们排除在顶级命名空间之外: function generateRandom() { if (!generateRandom.prevNums) { generateRandom.prevNums = {}; // ge

是否有任何方法可以引用当前正在执行的函数对象?如果它不是任何对象的方法,或者未使用
.call()
.apply()
调用,则
指针很可能只是
窗口
,而不是函数对象

我经常对全局变量使用这样的设计模式,我希望将其范围限定到特定的函数,因为这样可以将它们排除在顶级命名空间之外:

function generateRandom() {
    if (!generateRandom.prevNums) {    
        generateRandom.prevNums = {};    // generateRandom.prevNums is a global variable
    }
    var random;
    do {
        random = Math.floor((Math.random() * (99999999 - 10000000 + 1)) + 10000000);
    } while (generateRandom.prevNums[random])
    generateRandom.prevNums[random] = true;
    return(random.toString());
}
但是,我不希望每次使用作用域为该对象的变量时都必须拼写出函数名。如果函数的名称曾经更改过,那么有很多地方可以更改名称


有什么方法可以获取当前正在执行的函数对象吗?

我认为没有任何方法可以完全按照您的要求执行,但是您可以使用函数局部静态变量的闭包

您可以通过以下方式轻松实现这一点:

嗯,您可以使用
参数.callee()

来自MDN:

描述

被调用方是arguments对象的属性它可以用来表示 指向该函数体中当前正在执行的函数 函数。例如,当您不知道 此函数,例如匿名函数

注意:应该避免使用参数.callee(),只需给出 函数(表达式)名称

但是

您真正想要的是Javascript原型

function RandomSomethingGenerator()
{
   this.prevNums = {};
}

RandomSomethingGenerator.prototype.generate = function() { 
    var random;
    do {
        random = Math.floor((Math.random() * (99999999 - 10000000 + 1)) + 10000000);
    } while (this.prevNums[random])
    this.prevNums[random] = true;
    return(random.toString());
};
我为什么这么说

1.)所有这些函数都在污染全局空间

2.)即使你喜欢Jani的建议,并且你想要一个像现在这样的“静态”函数,我的建议也是一样的,但有一个转折点:创建你的全局函数,在闭包中包装一个对象的实例(从原型构建)并调用它(因此,基本上,让你自己成为一个单例)

如下所示(根据Jani的回答改编):


您需要
参数。被调用方
。发件人:

被调用方
参数
对象的属性。它可用于引用该函数的函数体中当前正在执行的函数。例如,当您不知道此函数的名称时,这非常有用,例如匿名函数的情况

例如:

> foo = function() { console.log(arguments.callee); };
> bar = function() { foo() };
> bar();
function () { console.log(arguments.callee) }

然而,我认为这是不赞成的。上面的链接说,“ECMAScript的第5版禁止在严格模式下使用参数.callee()。

我确认您不能在“严格模式”下使用参数.callee
。没有说您错了或其他任何事情,但是,当代码可能只是在函数本身中时,通过添加实际上没有任何作用的对象,这会使问题变得更加复杂:)@JaniHartikainen谢谢。输入错误已修复。@JaniHartikainen-对象是耦合状态和函数的理想方式-这正是OP试图做到的。我想说,到目前为止,这是一个非常成熟和真实的模式,并且很容易被任何人识别和理解,更不用说随着项目的扩大,它很容易编辑、维护和扩展。这是真的,它完成了这项工作,但在JavaScript中,它还有其他常见的模式,对语言来说更简单、更习惯。当然,如果他需要的不仅仅是一个随机化函数,那么这显然是创建一个对象的更好方法,它可以存储其他必要的函数。闭包非常适合将状态和函数临时绑定起来,并将其传递给其他东西。。。但是当问题是
时,我不认为这是一个合适的答案。我经常对全局变量使用这样的设计模式,我想将其范围限定到一个特定的函数,因为这样可以将它们排除在顶级名称空间之外…
…然后有很多地方可以更改名称。
如果有这么多地方,整个过程应该分解为使用原型构建的对象,原型定义了一些方法,可以使用
this
指针。这看起来是解决问题的最优雅的方法-谢谢。它还具有其他优点:1)按要求消除对函数名的依赖性,2)初始化变量更容易,3)它可以作为局部变量引用,而无需长点符号,4)变量对外隐藏/私有。现在,如果我下次需要的时候能记住这个语法。
var randomSomething = (function() {
    var randomSomethingGenerator = new RandomSomethingGenerator();

    return function() {
        randomSomethingGenerator.generate();
    };
})();
> foo = function() { console.log(arguments.callee); };
> bar = function() { foo() };
> bar();
function () { console.log(arguments.callee) }