4

我正在尝试逐步重构现有代码。我有一组已定义的函数,仅由一个内部参数不同:

function loadGame1():void
{
    loadGame("save1");
}
function loadGame2():void
{
    loadGame("save2");
}
function loadGame3():void
{
    loadGame("save3");
}
//... snip many, many lines

// Note- I cannot pass function arguments at this time!
picker(loadGame1, loadGame2, loadGame3 ...);    

我正在尝试至少重构其中的一部分(我还不能完全替换整个事情,太多的相互依赖关系)。

基本上,我希望能够生成一大组函数,函数之间的区别是内部参数:

var fNames:Array = new Array("save1", "save2", "save3");
var funcs:Array = new Array();
for (var i = 0; i < fNames.length; i += 1)
{
    trace("Creating function with indice = ", i);
    funcs.push(
        function() : void 
        {
            saveGame(fNames[i]);
        }
    )
}

picker(funcs[0], funcs[1], funcs[2] ...);

但是,据我了解,闭包会导致在ifor 循环范围之外维持状态,并且任何调用任何生成函数的尝试都会失败并出现越界错误,这就是您想要的期望在评估为假之前i将达到。fNames.size + 1i < fNames.size

因此,基本上,鉴于我需要生成作为参数传递给我目前无法更改的预先存在的函数的函数。如何动态生成这些函数?

4

1 回答 1

4

尝试使用IIFE

for (var i = 0; i < fNames.length; i += 1)
{
    (function(i){
        trace("Creating function with indice = ", i);
        funcs.push(
            function() : void 
            {
                saveGame(fNames[i]);
            }
        )
    })(i);
}
于 2013-11-02T06:05:47.513 回答