有没有办法引用你当前正在执行的函数对象?如果它不是任何对象的方法,或者不是用.call()或.apply()调用的,那么this指针很可能只是window,而不是函数对象。
我经常对全局变量使用这样的设计模式,我希望将它们的作用域限定为一个特定的函数,因为这使它们不在顶级命名空间之外:
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());
}但是,我不希望每次要使用范围为该对象的变量时都拼写出函数名。如果函数的名称发生更改,那么有很多地方可以更改名称。
有没有办法获取当前正在执行的函数对象?
发布于 2011-12-12 16:08:37
我不认为有任何方法可以完全做到你所要求的,但是你可以使用一个闭包来代替你的函数--局部静态变量。
您可以使用IIFE轻松实现这一点
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();
};
})();发布于 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原型。
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的答案):
var randomSomething = (function() {
var randomSomethingGenerator = new RandomSomethingGenerator();
return function() {
randomSomethingGenerator.generate();
};
})();发布于 2011-12-12 16:18:12
你想要arguments.callee。来自MDN - callee
callee是arguments对象的属性。它可用于引用该函数的函数体中当前正在执行的函数。例如,当您不知道此函数的名称时,这很有用,例如匿名函数的情况。
例如:
> foo = function() { console.log(arguments.callee); };
> bar = function() { foo() };
> bar();
function () { console.log(arguments.callee) }然而,我认为这是被弃用的。上面的链接显示,“ECMAScript的第5版禁止在严格模式下使用arguments.callee()。”
https://stackoverflow.com/questions/8471411
复制相似问题