动态创建匿名函数?

时间:2012-12-21 00:17:20

标签: javascript anonymous-function

我正致力于简单的进化AI。我需要动态生成一个匿名函数。为此我有一份条件和行动清单:

   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();
    }
}

如果需要,我可以更改数组的保存方式。怎么办呢?

所有字符behaviors都在这样的循环内调用:

for(i=0,i<chars.length,i++) {
chars[i].behavior.call();
}

6 个答案:

答案 0 :(得分:4)

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

var conditions = [
    enemyNear, 
    function () { return mySpeed() > 5; }, 
    function () { return 1 === 1; 
}];
var actions = [walk, attack, jump];

然后您可以将behave定义为:

var behave = function(condition, action) {
    if(condition()) {
        action();
    }
}

并使用它,例如:

behave(conditions[2], actions[1]);

此处,21可能是随机生成的数字,如下所示:

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)]
    );
};

称之为:

actRandomly(conditions, actions);

当然,这只是提出了这个想法,并没有整齐有序。

为了好玩,我创建了一个Basic jsFiddle Demo Version


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

答案 1 :(得分:3)

从此更改阵列:

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

对此:

conditions = [
    function() { return enemyNear() },  // or just enemyNear
    function() { return mySpeed() > 5 },
    function() { return 1 == 1 } // 1 = 1?
];

使用当前代码,您的函数将被调用,conditions将成为这些函数输出的数组。

答案 2 :(得分:3)

首先,在数组内部,您需要为条件和动作函数提供引用。现在,你正在调用它们,所以它们基本上和无用的数组相同,如:

conditions = [true, false, true];
actions = [undefined, undefined, undefined];

我会纠正这样的事情:

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();
    }
  }
}

您可以在此JSFiddle demo上看到它。

答案 3 :(得分:1)

condition = [
    enemyNear,
    function() { return mySpeed() > 5; },
    function() { return 1 == 1; }
];

答案 4 :(得分:0)

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

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

conditions = [enemyNear]
actions = [walk]

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

答案 5 :(得分:-6)

简单。使用eval()

var behavior;
eval("behavior = function() { if (enemyNear()) walk(); }");
behavior();