选择函数的子集作为字符串并计算
Pick subset of functions as string & evaluate
我有一组定义的JS函数。我希望用户使用逗号分隔的字符串选择其中的子集。然后我想从他们的子集中随机选择,并评估所选的函数。我有这 99% 的工作,除了由于某种原因它没有评估。为什么控制台一直告诉我"未定义不是函数"?
看看第 37 行:http://jsfiddle.net/ftaq8q4m/
// 1 User picks a subset of function names as a comma seperated string.
var effectSubset = 'func4, func5, func6';
// 2 Available functions
function func1() {
$('html').append('func1');
}
function func2() {
$('html').append('func2');
}
function func3() {
$('html').append('func3');
}
function func4() {
$('html').append('func4');
}
function func5() {
$('html').append('func3');
}
function func6() {
$('html').append('func4');
}
var autoPlay = function () {
// 3 Get the user's subset of functions, turn into array
effectArray = effectSubset.split(',');
// 4 Pick random function from array
var effect = effectArray[Math.floor(Math.random() * effectArray.length)];
// 5 run the randomly picked function
window[effect]();
}
// 6 Re-run every second
var playInterval = setInterval(autoPlay, 1000);
我可以看到两件事是错误的:
- 您的函数未分配给
window
- 您的
"effect"
变量包含前导空格
我在这里纠正了上述几点:http://jsfiddle.net/ftaq8q4m/1/
这似乎已经解决了您描述的问题。
例:
window.func1 = function() {
$('html').append('func1');
}
和:
window[effect.trim()]();
更新
作为奖励,我修复了您的误导性附加消息 =D
http://jsfiddle.net/ftaq8q4m/5/
您的方法不起作用,因为函数名称之间有一个空格 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
这是一个演示 http://jsbin.com/lixeto/edit?html,js,output
有两个问题:首先,拆分输入后存在前导空格,其次,JSFiddle 将脚本包装在 IIFE 中。第一个问题可以通过使用 ' ,' 拆分或使用修剪函数映射生成的数组来解决。第二个问题可以通过创建一个对象来分配函数来解决。有关工作示例,请参阅此小提琴。
// 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);
相关文章:
- 如何将字符串拆分为字符,但在javascript中保留空格
- 如何显示字符串中最多 200 个字符
- 我想在Javascript中探索类似C语言的字符串的整个字符
- 如何用jquery替换字符串中可能变化的字符
- 通过跳过拆分字符在 javascript 中拆分字符串
- 使用正则表达式匹配长度为六个字符的字母数字字符串
- 字符串替换-不支持格式字符'}'
- 到UpperCase字符串Javascript中的特定字符索引
- 用类javascript包装span标记中字符串中的字符索引
- 将字符串分组为n个字符的块,并应用替换
- 如何检查一个字符串的所有字符是否都存在于另一个字符串中
- 在字符串列表中搜索任何出现的单词,如果单词的第一个字符匹配,则高亮匹配单词.Javascript正则表达式
- Javascript-正则表达式,用于在未转义字符上拆分字符串,例如|,但忽略|
- Regex-从字符第N次出现到字符串末尾的匹配
- Visual Studio 2010跳转到下一个任意字符/字符串
- 估计存储在 localStorage (Javascript) 中的 10,000 个字符字符串的大小
- 字符字符串中最后一个单词的第一个字母
- 匹配任何字符字符串的正则表达式,最多为“/”Javascript
- 将特殊字符字符串到 JSON 字符串化非法令牌中
- 在javascript中计算精确的字符字符串高度