Javascript 动态创建匿名函数?

Javascript 动态创建匿名函数?,javascript,anonymous-function,Javascript,Anonymous Function,我正在研究简单的进化人工智能。我需要动态生成一个匿名函数。为此,我有一个条件和行动列表: var conditions = [ function () { return enemyNear(), }, function () { return mySpeed() > 5; }, function () { return 1 === 1; }]; var actions = [ function () { return alert('wal

我正在研究简单的进化人工智能。我需要动态生成一个匿名函数。为此,我有一个条件和行动列表:

   var conditions = [
    function () { return enemyNear(), }, 
    function () { return mySpeed() > 5; }, 
    function () { return 1 === 1; }];
   var actions = [
      function () { return alert('walk'); },
      function () { return alert('jump'); } 
      function () { return alert('attack'); } ]
代码选择其中一个来生成新函数:

condition = conditions [Math.floor(Math.random()*conditions .length)];
actions = conditions [Math.floor(Math.random()*actions .length)];
如果选择的条件是
enemyNear()
,选择的操作是
walk()
,我如何生成简单的匿名函数

behavior = function() {
    if(enemyNear()) {
        walk();
    }
}
如果需要,我可以更改阵列的保存方式。如何做到这一点

所有字符
行为
在循环内被调用,如下所示:

for(i=0,i<chars.length,i++) {
chars[i].behavior.call();
}
var getRandomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

var actRandomly = function (conditions, actions) {
    behave(
        conditions[getRandomInt(0, conditions.length -1)],
        actions[getRandomInt(0, actions.length -1)]
    );
};
var conditions = [enemyNear, 
  function() { return mySpeed() > 5 }, 
  function(){ return true; }];
var actions = [walk, attack, jump];

for(i=0,i从此更改数组:

conditions = [enemyNear(), mySpeed()>5, 1=1];
为此:

conditions = [
    function() { return enemyNear() },  // or just enemyNear
    function() { return mySpeed() > 5 },
    function() { return 1 == 1 } // 1 = 1?
];
使用当前代码,您的函数将被调用,
条件
将成为这些函数的输出数组。

简单。使用eval()

您需要将函数存储在
数组中,而不是调用它们,否则将函数的结果存储在数组中

function enemyNear() {}
function walk() {}

conditions = [enemyNear]
actions = [walk]

behaviour = function() {
  if(conditions[randomNumber]()) {
    actions[randomNumber]();
  }
}

最简单的方法是只将函数放入数组中:

var conditions = [
    enemyNear, 
    function () { return mySpeed() > 5; }, 
    function () { return 1 === 1; 
}];
var actions = [walk, attack, jump];
然后您可以将
行为定义为:

var behave = function(condition, action) {
    if(condition()) {
        action();
    }
}
并使用它,例如:

behave(conditions[2], actions[1]);
这里,
2
1
可以是这样一个随机生成的数字:

for(i=0,i<chars.length,i++) {
chars[i].behavior.call();
}
var getRandomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

var actRandomly = function (conditions, actions) {
    behave(
        conditions[getRandomInt(0, conditions.length -1)],
        actions[getRandomInt(0, actions.length -1)]
    );
};
var conditions = [enemyNear, 
  function() { return mySpeed() > 5 }, 
  function(){ return true; }];
var actions = [walk, attack, jump];
可以这样说:

actRandomly(conditions, actions);
当然,这只是提出了想法,并没有很好地组织起来

为了好玩,我创建了一个



注意:在定义变量时始终使用
var
。不要污染全局范围。

首先,在数组内部,您需要对条件和操作函数进行引用。现在,您正在调用它们,因此它们基本上与无用数组相同,如:

condition = [
    enemyNear,
    function() { return mySpeed() > 5; },
    function() { return 1 == 1; }
];
conditions = [true, false, true];
actions = [undefined, undefined, undefined];
我想把它改成这样:

for(i=0,i<chars.length,i++) {
chars[i].behavior.call();
}
var getRandomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

var actRandomly = function (conditions, actions) {
    behave(
        conditions[getRandomInt(0, conditions.length -1)],
        actions[getRandomInt(0, actions.length -1)]
    );
};
var conditions = [enemyNear, 
  function() { return mySpeed() > 5 }, 
  function(){ return true; }];
var actions = [walk, attack, jump];
然后您可以创建一个函数来生成行为:

function generateBehavior(){
  var condition = conditions[Math.floor(Math.random() * conditions.length)];
  var action = actions[Math.floor(Math.random() * actions.length)];
  return function() {
    if(condition()) {
      action();
    }
  }
}

您可以看到它在这方面的作用。

问题是,当您将函数放置在数组中时,您已经调用了这些函数。
walk
是对函数的引用,而
walk()
调用函数并使用返回值。我想象函数没有正确地保存在数组中,如果需要,我可以更改它们的保存方式。不鼓励使用
eval
。更好的方法是存储函数,然后调用每个函数。这个问题听起来像是需要一种自我编程行为Red。为此,需要(Author)。@ Tyron:为什么要使用<代码> EVA而不是匿名函数?@ Brand,因为OP想要生成匿名函数,而不是定义它们。@为什么你认为 EVA/COD>是这个工作的合适工具而不是匿名函数?(或创建匿名函数的函数)?这是一个很好的解决方案。我不知道它是否适用于我的情况。首先,当我调用函数时,我不能传递任何值。我想这是可以解决的。此外,我需要很多多样性,处理字符串的那种。例如:使用字符串,我可以简单地创建一个解析它的函数,让我修改条件,添加两个条件,change操作。也许有一种方法可以将其字符串化并重新更改,或者解析函数并修改它。(我不知道是否有必要这样做,我只是在头脑风暴)很抱歉,如果我不能更详细地解释的话,这个小框没有帮助。这工作非常完美。这确实超出了原始问题的范围,但有没有办法在以后修改函数?例如:添加第二个条件?虽然只是一个条件,但可以将其转换为字符串(使用它做任何我想做的事情)然后把它转换回函数,这样我就可以避免eval了?这真的是最好的,因为使用字符串会给我带来很多好处versitility@Liso22代替
if(condition())
,您可以从条件数组中选择索引,然后执行
if(conditions[i])
,然后更改
conditions[i]
切换到其他功能