我有一组已定义的JS函数。我希望用户使用逗号分隔的字符串选择其中的一部分。然后我想从他们的子集中随机选择,并评估所选的功能。我有99%的工作,除了由于某种原因没有评估。为什么控制台一直告诉我&undecile不是函数'?
看看第37行:http://jsfiddle.net/ftaq8q4m/
input
答案 0 :(得分:0)
我看错了两件事:
window
"effect"
变量包含前导空格我在此更正了以上几点:http://jsfiddle.net/ftaq8q4m/1/
这似乎解决了您所描述的问题。
示例:强>
window.func1 = function() {
$('html').append('func1');
}
并强>
window[effect.trim()]();
<强>更新强>
作为奖励,我修正了你误导性的附加消息= D
答案 1 :(得分:0)
您的方法无效,因为函数名称之间有空格
var effectSubset = 'func4, func5, func6';
拆分后,变量效果在函数名称前面有一个空格。
所以被调用的函数是func4
,<space>func5
,<space>func6
,其空格不存在。
首先,拥有命名空间会更好。
var effectSubset = 'func4,func5,func6'; // <--- remove spaces here or trim like in other answers
window.myNamespace = {};
window.myNamespace.func1 = function() {
$('html').append('func1');
}
// ..... define other functions like above
window["myNamespace"][effect](); // <-- this should work
答案 2 :(得分:-1)
有两个问题:首先在分割输入后有前导空格,第二个,JSFiddle将你的脚本包装在IIFE中。第一个问题可以通过分割&#39;来解决。 &#39;或使用trim函数映射结果数组。第二个问题可以通过创建一个分配函数的对象来解决。有关工作示例,请参阅此fiddle。
// 1 User picks a subset of function names as a comma seperated string.
var effectSubset = 'func4, func5, func6';
// 2 Available functions
var funcObj = {
func1: function func1() {
$('html').append('func1');
},
func2: function func2() {
$('html').append('func2');
},
func3: function func3() {
$('html').append('func3');
},
func4: function func4() {
$('html').append('func4');
},
func5: function func5() {
$('html').append('func3');
},
func6: function func6() {
$('html').append('func4');
}
};
var autoPlay = function () {
// 3 Get the user's subset of functions, turn into array
effectArray = effectSubset.split(',').map(function(func) { return func.trim() });
// 4 Pick random function from array
var effect = effectArray[Math.floor(Math.random() * effectArray.length)];
// 5 run the randomly picked function
funcObj[effect]();
}
// 6 Re-run every second
var playInterval = setInterval(autoPlay, 1000);