在Javascript中从数组运行代码的最佳和最安全的方法是什么?

时间:2014-02-05 19:18:02

标签: javascript php mysql arrays eval

所以这很可能是错误的做法,但我一直在考虑这种方法一段时间,我想不出更好的方法。

我正在与朋友一起使用Javascript和Canvas进行roguelike游戏,并使用PHP将我们的数据(怪物,物品等)存储到MySQL数据库中。

我们将比赛场地划分为四个独立的象限。整个游戏区域为20 x 20平方,因此我们编码了10 x 10个地下城象限。我们的想法是从一个带有地下象限代码的数组中获取代码并以某种方式执行此代码。目前我们有四个象限函数,它们在这些象限内绘制环境对象并给它们赋值,但这些在函数中是硬编码的。我希望能够从数组中随机选择一个值,并将该代码放在这些函数中。

我听说过一个名为eval()的神秘黑魔法程序。我需要转向黑暗面还是有更好的方法?

我将包含一些代码,以便您可以看到基本的想法。

////Matrix creation / declaration
var coordinates = new Array(mapWidth);
for (var i = 0; i <mapWidth; i++) {
    coordinates[i] = new Array(mapHeight);          
}

//sets array to 0 which is not an object
for (var i=0; i<mapWidth; i++) {
    for (var j=0; j<mapHeight; j++) {
        coordinates[i][j] = 0;
    }
}

function quadrantOneLoader()
{
    var x = 0;
    var y = 0;

    for (var i = 0; i < 10; i++)
    {
        if (i % 2 === 1 && i != 3)
        {
            coordinates[x + i][y + 1] = new environment();
            coordinates[x + i][y + 1].image.src = "images/column.png";
        }
        else if (i % 2 === 1)
        {
            coordinates[x + i][y + 1] = new environment();
            coordinates[x + i][y + 1].image.src = "images/brokenColumn.png";
        }
    }

    for (var i = 0; i < 10; i++)
    {
        if (i % 2 === 0 && i !== 8)
        {
            coordinates[x + i][y + 3] = new environment();
            coordinates[x + i][y + 3].image.src = "images/column.png";
        }
        else if (i % 2 === 0)
        {
            coordinates[x + i][y + 3] = new environment();
            coordinates[x + i][y + 3].image.src = "images/brokenColumn.png";
        }
    }

    for (var i = 0; i < 10; i++)
    {
        if (i % 2 === 0 && i !== 4)
        {
            coordinates[x + i][y + 7] = new environment();
            coordinates[x + i][y + 7].image.src = "images/column.png";
        }
        else if (i % 2 === 0)
        {
            coordinates[x + i][y + 7] = new environment();
            coordinates[x + i][y + 7].image.src = "images/brokenColumn.png";
        }
    }

    for (var i = 0; i < 10; i++)
    {
        if (i % 2 === 1 && i !== 7)
        {
            coordinates[x + i][y + 9] = new environment();
            coordinates[x + i][y + 9].image.src = "images/column.png";
        }
        else if (i % 2 === 1)
        {
            coordinates[x + i][y + 9] = new environment();
            coordinates[x + i][y + 9].image.src = "images/brokenColumn.png";
        }
    }

    coordinates[x + 1][y + 5] = new environment();
    coordinates[x + 1][y + 5].image.src = "images/stocks.png";

    coordinates[x + 4][y + 5] = new environment();
    coordinates[x + 4][y + 5].image.src = "images/candelabra.png";

    coordinates[x + 7][y + 5] = new environment();
    coordinates[x + 7][y + 5].image.src = "images/stocks.png";
}

所以基本上quadrantOneLoader()函数中的代码将放在数组中。我想将它注入到这个函数中,所以看起来更像是这样:

function quadrantOneLoader()
{
    var x = 0;
    var y = 0;

    quadrants[Math.floor(Math.random()*quadrants.length())];
}

2 个答案:

答案 0 :(得分:1)

很难看到你在eval没有看到一些实际代码时想要完成的事情,但是在黑暗中你可以利用javascript闭包来封装数据。你可以有一个函数数组,它们返回一个操作数据的函数,然后将这些函数传递给需要调用数据的函数;

function quadrantBehaviourBuilderOne(someValOne,someValTwo,someValThree){
    var quadrantBehaviour = function(){
        var something = someValueOne - (someValueTwo * someValThree);
        return something;
    }
    return quadrantBehaviour;
}

var behaviourBuilderArray = [quadrantBehaviourBuilderOne,someOtherBuilder,etc];

function somethingThatWorksWithTheBuilder(someBuiltFunction){
       someBuiltFunction();
}

var trees = 5;
var plants = 10;
var locknessmonsters = 350;

var randomNumber = 0;
var myBuiltBehaviourFunction = behaviourBuilderArray[randomNumber](trees,plants,locknessmonsters);
somethingThatWorksWithTheBuilder(myBuiltBehaviourFunction);

答案 1 :(得分:0)

我们最终做了这样简单的事情:

var dungeonCode = new Array();

dungeonCode[0] = function(/*pass whatever you want here, we chose to pass x and y*/)
{
    //code to place the dungeon tiles here
}

然后你要做的就是:

dungeonCode[0]();

我们最终制作了一堆这样的地下城象限并使用随机数生成器调用它们。

我猜括号表示解释器执行数组中包含的任何代码作为函数。整齐!