在类中执行私有函数的名称(字符串)

Wh1*_*Ck5 0 javascript class function callback

目前我有这样简单的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 ...
}
Run Code Online (Sandbox Code Playgroud)

并测试它我正在使用此代码:

x = new MyClass();
x.Create();
Run Code Online (Sandbox Code Playgroud)

我有一些麻烦来执行这个功能的名字.如果我把just eval(funcName);而不是setTimeout调用它工作正常但无法弄清楚为什么它不能这样工作.

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

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

注意:将此函数设为public(this.myTestFunc = ...)不是一个选项!

更新:

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

Ben*_*aum 5

参考更新:

而不是设置:

 var funcName = "getRandomEffectFunctionNeme()";
Run Code Online (Sandbox Code Playgroud)

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

 var funcRef = getRandomEffectFunctionNeme;
Run Code Online (Sandbox Code Playgroud)

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

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

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

var filters = [lowPass,highPass,blur];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

var filter = filters[chosen];
setTimeout(filter,1000);
Run Code Online (Sandbox Code Playgroud)

(*只是尝试调试它,它基本上会每次运行时调用编译器并且非常慢)


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

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

  • 传递对函数的引用而不是字符串,这就是重点. (2认同)