有没有办法在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) }