首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在javascript中获取当前正在执行的函数对象?

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

Stack Overflow用户
提问于 2011-12-12 16:04:43
回答 3查看 1.7K关注 0票数 1

有没有办法引用你当前正在执行的函数对象?如果它不是任何对象的方法,或者不是用.call()或.apply()调用的,那么this指针很可能只是window,而不是函数对象。

我经常对全局变量使用这样的设计模式,我希望将它们的作用域限定为一个特定的函数,因为这使它们不在顶级命名空间之外:

代码语言:javascript
复制
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());
}

但是,我不希望每次要使用范围为该对象的变量时都拼写出函数名。如果函数的名称发生更改,那么有很多地方可以更改名称。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-12 16:08:37

我不认为有任何方法可以完全做到你所要求的,但是你可以使用一个闭包来代替你的函数--局部静态变量。

您可以使用IIFE轻松实现这一点

代码语言:javascript
复制
var generateRandom = (function() {
    //any function's static variables go here
    var prevNums = {};

    return function() {
        //function code goes here
        var random;
        do {
            random = Math....
        }

        prevNums[random] = true; 

        return random.toString();
    };
})();
票数 1
EN

Stack Overflow用户

发布于 2011-12-12 16:11:24

你可以使用arguments.callee()..。

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee

来自MDN:

描述

callee是arguments对象的属性。它可以用来引用该函数的函数体中当前正在执行的函数。例如,当你不知道这个函数的名称时,这是很有用的,例如匿名函数。

注意:您应该避免使用arguments.callee(),只给每个函数(表达式)一个名称。

但是..。

你真正想要的是Javascript原型。

代码语言: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的答案):

代码语言:javascript
复制
var randomSomething = (function() {
    var randomSomethingGenerator = new RandomSomethingGenerator();

    return function() {
        randomSomethingGenerator.generate();
    };
})();
票数 1
EN

Stack Overflow用户

发布于 2011-12-12 16:18:12

你想要arguments.callee。来自MDN - callee

callee是arguments对象的属性。它可用于引用该函数的函数体中当前正在执行的函数。例如,当您不知道此函数的名称时,这很有用,例如匿名函数的情况。

例如:

代码语言:javascript
复制
> foo = function() { console.log(arguments.callee); };
> bar = function() { foo() };
> bar();
function () { console.log(arguments.callee) }

然而,我认为这是被弃用的。上面的链接显示,“ECMAScript的第5版禁止在严格模式下使用arguments.callee()。”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8471411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档