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();!这只是一个随机值.
参考更新:
而不是设置:
var funcName = "getRandomEffectFunctionNeme()";
Run Code Online (Sandbox Code Playgroud)
因此,您应该设置对函数名称的引用
var funcRef = getRandomEffectFunctionNeme;
Run Code Online (Sandbox Code Playgroud)
并设置对函数本身的引用.这不仅避免了setTimeout 字符串的问题*.它还解决了您的闭包问题,因为您的代码的结构是以超时访问函数本身的方式构建的.
在您的情况下,假设您有一些过滤器功能,例如lowPass highPass和blur.在这种情况下,我们将选择一个函数,而不是选择函数名称.
首先,我们将这些函数存储在一个数组中:
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它时无论如何都可以访问它,因为它们在同一个闭包中.