2013-02-21 33 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

相關問題