gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:25:58 26 4
gpt4 key购买 nike

有什么方法可以引用您当前正在执行的函数对象吗?如果它不是任何对象的方法或不是使用 .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());
}

但是,我宁愿不必每次都想使用作用域为该对象的变量时拼出函数名称。如果函数的名称发生变化,则有很多地方可以更改名称。

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

最佳答案

那么,您可以使用arguments.callee()...

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

来自 MDN:

Description

callee is a property of the arguments object. It can be used to refer to the currently executing function inside the function body of that function. This is for example useful when you don't know the name of this function, which is for example the case with anonymous functions.

Note: You should avoid using arguments.callee() and just give every function (expression) a name.

但是...

您真正想要的是 Javascript 原型(prototype)。

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 的建议,并且你想要一个像现在这样的“静态”函数,我的建议也是一样的,但有一点不同:创建你的全局函数,并包装一个对象的实例(从原型(prototype)构建)在闭包内并调用它(所以,基本上,让自己成为一个单例)。

如此(改编自 Jani 的回答):

var randomSomething = (function() {
var randomSomethingGenerator = new RandomSomethingGenerator();

return function() {
randomSomethingGenerator.generate();
};
})();

关于javascript - 有什么方法可以在 javascript 中获取当前正在执行的函数对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8471411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com