2010-03-08 85 views
3

更新2:
我真正想要問的是已經在另一頁中爭論。請檢查以下條目。
(感謝BobS。)
How can I access local scope dynamically in javascript?Javascript:調用一個函數用字符串匿名函數編寫,函數的名字沒有eval?


你好。

我已經開始使用jQuery,想知道如何從String中動態地調用匿名函數中的函數。 比方說,例如,我有以下功能:

function foo() { 
// Being in the global namespace, 
// this function can be called with window['foo']() 
    alert("foo"); 
} 

jQuery(document).ready(function(){ 
    function bar() { 
    // How can this function be called 
    // by using a String of the function's name 'bar'?? 
    alert("bar"); 
    } 

    // I want to call the function bar here from String with the name 'bar' 
} 

我一直在試圖找出這可能是「窗口」的對手,它甚至可以從全局命名空間功能,如窗口[」富「。 在上面的小例子中,如何從String「bar」調用函數欄?

謝謝你的幫助。

更新
這是我想要的東西:

  1. 定義那些只在封閉的功能。
  2. 避免在包含這些函數的閉包中創建一個Object,以便作爲obj ['bar']進行訪問。
  3. 避免評估(如果可能的話),以便更直接地編寫代碼(如果存在)。
  4. 通過URI參數或任何變量動態地決定函數的名稱。

作爲JavaScript的一個新手,我想「這」將在關閉「窗口」的對應,並試圖寫:

// in the closure 
name = 'bar'; 
this[name]; // undefined ... 

和失敗(當然...)。
所有這些都是爲了追求更進一步的懶惰。 Javascript對我來說是一種新鮮事物,目前我一直試圖儘可能懶惰地編寫代碼。

+1

Eval在這裏看起來是個不錯的選擇。無論如何,你可能會創建嵌套閉包,不是嗎?你能解釋一下這個場景嗎?你爲什麼把'bar'當成一個字符串?您是否考慮過在需要它們的地方定義這些功能? – Kobi 2010-03-08 05:31:33

+0

非常感謝您的評論和建議。爲了清楚起見,我在上面的問題板中添加了我想要的內容(下面的編輯)。我希望這一次我的解釋足以被理解。謝謝。 – Wanien 2010-03-08 06:27:30

回答

2

正如Kobi寫的,eval可能是一個不錯的選擇。另外,有什麼理由不這樣做

$(function(){ 
    var localNamespace = {}; 
    function bar() { 
     alert("bar"); 
    } 
    localNamespace['bar'] = bar; 
    // Now bar() can be called by, well, localNamespace['bar'] 
} 

更新: 相似,所以條目,如How can I access local scope dynamically in javascript?,似乎表明你的運氣,而無需使用這兩種方法什麼的,甚至醜陋的一個。

+0

非常感謝您的意見和建議。我很感激。 非常感謝你的網址。在我發佈之前,我試圖找到這種入口,但找不到任何東西。知道做我想做的事情是不可能的,我已經邁出了一大步。再次感謝你BobS。 – Wanien 2010-03-08 07:03:47

2

裏面你ready功能:

window.bar = function bar() { 
    // ... 
} 

然後,您可以訪問window['bar']

+0

非常感謝您的及時回覆。我很感激。 但是,我想在閉包中定義函數欄,而不是在全局範圍內,因爲我想將函數限制在特定函數(情境)中。我很抱歉,我的解釋可能不夠。謝謝。 – Wanien 2010-03-08 05:50:44

+1

對不起,如果我在這裏扮演魔鬼的擁護者,但是:如果你想從封閉外部訪問這個函數,爲什麼要在關閉中定義它?這不是破壞目的嗎? – 2010-03-08 07:06:57

+0

任何指出將歡迎在這裏:)謝謝你的評論。我想通過從函數名字符串中動態調用函數,而不是從外部訪問函數。但實際上,我也想知道是否可以從封閉之外調用它:) – Wanien 2010-03-08 07:45:08