选择函数子集作为字符串&评估

时间:2015-06-19 14:52:48

标签: javascript jquery arrays string function

我有一组已定义的JS函数。我希望用户使用逗号分隔的字符串选择其中的一部分。然后我想从他们的子集中随机选择,并评估所选的功能。我有99%的工作,除了由于某种原因没有评估。为什么控制台一直告诉我&undecile不是函数'?

看看第37行:http://jsfiddle.net/ftaq8q4m/

input

3 个答案:

答案 0 :(得分:0)

我看错了两件事:

  1. 您的功能未分配到window
  2. 您的"effect"变量包含前导空格
  3. 我在此更正了以上几点:http://jsfiddle.net/ftaq8q4m/1/

    这似乎解决了您所描述的问题。

    示例:

    window.func1 = function() {
        $('html').append('func1');
    }
    

    window[effect.trim()]();
    

    <强>更新

    作为奖励,我修正了你误导性的附加消息= D

    http://jsfiddle.net/ftaq8q4m/5/

答案 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 

这是一个演示 http://jsbin.com/lixeto/edit?html,js,output

答案 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);