选择函数的子集作为字符串并计算

Pick subset of functions as string & evaluate

本文关键字:字符 字符串 串并 计算 函数 子集 选择      更新时间:2023-09-26

我有一组定义的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);

我可以看到两件事是错误的:

  1. 您的函数未分配给window
  2. 您的"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);