2013-02-21 71 views
1

我正在循环中使用动态创建的函数。如何注入一个变量作为字符串?

for (var i = 0; i < 4; i++) { 
     window["functiontest" + i] = function() { alert(i); } 
} 

它的工作原理,但不是我想如何让它工作。因为当我这样做时,这意味着当functiontest0将运行时,它将提醒“3”,因为它实际上在循环完成时添加var i

我想要的是以某种方式“硬编码”当前的i,所以它实际上会提醒“0”而不是“3”。我的意思是这样的:

window["functiontest" + i] = function() { 
    // I need just the current state for `i` here and 
    // not just the variable `i` - so for exampe I need 
    // it as `i` literally put 0 
} 

有没有什么办法可以迫使它可将结果写成“串”或其他什么东西?

THX for help guys。并抱歉重复无法找到任何东西,而搜索它。主要是因为我不能解释它是那么好:-)

但我结束了这样的事情:

for (var genfunc = 0; genfunc < 4; genfunc++) { 

    if (genfunc == 0) { //left 
     window["keyDown" + sys_curcontrols[genfunc]] = (function (unique) { 
      return function() { window["sys_keyLeft" + unique] = -1; } 
     })(nid); 
    } 

回答

2

的,你需要使用一个函数来创建范围一个很好的例子。

for (var i = 0; i < 4; i++) { 
    window["functiontest" + i] = (function(index) { 
     return function() { alert(index); } 
    })(i); 
} 
+0

不。它是执行函数以创建范围的完美示例。如果我们将闭包定义为带有自由变量的函数,那么刚刚添加的函数不是闭包。然而,你返回的函数(和函数原始代码)是闭包,这就是为什么问题甚至存在(并且由于JavaScript处理自由变量的原因)。 – 2013-02-21 21:12:50

+1

@FelixKling,好点。我修改了答案。 – Lukas 2013-02-21 21:19:38

+0

thx求助:-) – JohnMalkowich 2013-02-21 21:34:04

2

您正在通过引用传递该变量。使用匿名函数来影响变量以传递值:

(function(i) { 
    window['functiontest' + i] = function() { 
     alert(i); 
    }; 
})(i); 

此外,请不要使这样的全局变量。使用对象:

var functiontest = {}; 

(function(i) { 
    functiontest[i] = function() { 
     alert(i); 
    }; 
})(i); 
+0

thx求助......但为什么不使用全局变量呢?我需要能够随处获得功能......这是一个性能问题吗? – JohnMalkowich 2013-02-21 21:34:59

+1

@JohnMalkowich:不,它只是无法维护。这里不是全局问题。这就是你正在制作一个应该包含在一个对象中的全局变量。 – Blender 2013-02-21 23:37:56

相关问题