gpt4 book ai didi

javascript - 通过名称(字符串)执行类内的私有(private)函数

转载 作者:行者123 更新时间:2023-11-28 12:00:44 24 4
gpt4 key购买 nike

目前我有一个简单的 JavaScript 类,如下所示:

function MyClass() {

// ... some code ...

this.Create = function() {
funcName = 'myTestFunc()';
cTimer = setTimeout(funcName, 1000);
}

// ... more code ...

var myTestFunc = function() {
alert ('everything\'s OK!');
}

// ... more code ...
}

为了测试它,我使用以下代码:

x = new MyClass();
x.Create();

我在通过名称执行此函数时遇到一些麻烦。如果我只使用 eval(funcName); 而不是 setTimeout 调用,它可以正常工作,但无法弄清楚为什么它不能以这种方式工作。

当然,这是更复杂代码的一部分,但其余代码与此问题无关。

我的问题很明显 - 如何通过设置为 setTimeout 函数参数的名称来执行函数?可能吗?

注意:不能公开此函数 (this.myTestFunc = ...)!

更新:

funcName = "myTestFunc()"; 只是一个示例。在实际代码中,它看起来像 funcName = getRandomEffectFunctionName();!这只是一个随机值。

最佳答案

引用更新:

而不是设置:

 var funcName = "getRandomEffectFunctionNeme()";

因此,您应该设置对函数的名称的引用

 var funcRef = getRandomEffectFunctionNeme;

并设置对函数本身的引用。这不仅避免了字符串的 setTimeout 问题*。它还解决了您的关闭问题,因为您的代码的结构方式使得超时可以访问函数本身。

就您的情况而言,我们假设您有一些过滤器函数,例如 lowPass highPassblur。在这种情况下,我们将选择一个函数,而不是选择一个函数名称

首先,我们将这些函数存储在一个数组中:

var filters = [lowPass,highPass,blur];

在 JavaScript 中,函数是一等对象,您可以像其他对象一样传递它们。

接下来,我们将得到一个随机数

var chosen = Math.floor(Math.random()*3);//get a random number between 0 and 2

最后,我们将选择过滤器并调用它

var filter = filters[chosen];
setTimeout(filter,1000);

(*只要尝试调试它,它基本上每当运行时都会调用编译器并且速度非常慢)

<小时/>

您只需将函数作为参数传递给 setTimeout,而不是字符串 setTimeout(myTestFunc,1000)

当调用Create时,无论如何它都可以访问它,因为它们位于同一个闭包中。

关于javascript - 通过名称(字符串)执行类内的私有(private)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16452137/

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