Javascript 选择函数子集作为字符串并求值

Javascript 选择函数子集作为字符串并求值,javascript,jquery,arrays,string,function,Javascript,Jquery,Arrays,String,Function,我有一组定义的JS函数。我希望用户使用逗号分隔的字符串选择其中的一个子集。然后我想从它们的子集中随机选取,并计算所选的函数。我有这99%的工作,除了它不是出于某种原因评估。为什么控制台总是告诉我‘未定义不是函数’ 看一看第37行: 我可以看出两件事不对: 您的功能未分配给窗口 您的效果变量包含前导空格 我在这里纠正了以上几点: 这似乎解决了您描述的问题 例如: 以及: 更新 作为奖励,我修复了您的错误附加消息=D 您的方法不起作用,因为函数名之间有空格 var effectSubset='fun

我有一组定义的JS函数。我希望用户使用逗号分隔的字符串选择其中的一个子集。然后我想从它们的子集中随机选取,并计算所选的函数。我有这99%的工作,除了它不是出于某种原因评估。为什么控制台总是告诉我‘未定义不是函数’

看一看第37行:


我可以看出两件事不对:

您的功能未分配给窗口 您的效果变量包含前导空格 我在这里纠正了以上几点:

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

例如:

以及:

更新

作为奖励,我修复了您的错误附加消息=D


您的方法不起作用,因为函数名之间有空格 var effectSubset='func4,func5,func6';拆分后,变量effect在函数名称前有一个空格

因此,被调用的函数是func4、func5、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 

这里是一个演示

有两个问题:首先,在分割输入后有前导空格,其次,JSFIDLE正在将脚本包装到IIFE中。第一个问题可以通过使用“,”进行拆分或使用trim函数映射生成的数组来解决。第二个问题可以通过创建一个对象来解决。请参见下面的工作示例

// 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);

`窗口[效果];`您在这里指的是哪个窗口?在试图弄清楚这一点时,我看到有人建议将字符串作为函数运行,但我认为它不起作用,因为它在函数中。您的函数不在这里的窗口对象中。所以你可以像这个窗口[func1]=函数{};window.func1=函数{};将它们添加到window对象中,然后试一试?快速提问,在完整的应用程序中,我在几个元素上使用了这个函数,实际上是附加到各个元素而不是html标记上。我已经将var设置为'that'等于'this'来维护'this'的范围,但是似乎window方法把它弄糟了,是吗?所有的附加只是进入最后一个元素,而不是现在的每个元素。只要在分配函数和调用函数时这个或那个的范围对您可用,您就可以了。窗户在这两种情况下都很方便,因此可以正常使用。我来看看小提琴:这是我要说的东西的中间部分:我可能应该在最初的问题中包含这些信息,但我试图使其尽可能简化。我不确定我是否完全理解你更广泛目标的细节,但是我修改了一个小提琴,用那个变量代替了窗口。非常感谢。这个更新的JSFIDLE向我展示了我到底做错了什么。
window[effect.trim()]();
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 
// 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);