2013-12-19 62 views
2

這是可以在JavaScript中嗎?我嘗試調用名稱爲「name」的變量(對不起!)。該功能不在全球範圍內。JavaScript調用函數的名字是一個函數的字符串在一個匿名範圍內

(function() { 
    var myFunc, name; 

    myFunc = function(){ 
     alert("Hi!"); 
    }; 
    name = "myFunc"; 
    //myFunc(); // work 

    (name)(); // do not work 
    this[name](); // do not work 

})(); 

注:我有一個的jsfiddle進入here

+3

你幾乎肯定想在這裏使用一個對象。 – lonesomeday

+0

你能舉個例子嗎?不要忘記,我的案件減少,只顯示我正在處理的問題。 –

+1

爲什麼你不能做name = myFunc然後name()? – AbhinavRanjan

回答

4

沒有針對「本地範圍」的對象像有全球範圍。你可以(也應該)做自己的對象來保存功能:

(function() { 
    var name = "myFunc"; 

    var funcs = { 
     myFunc: function(){ 
      alert("Hi!"); 
     } 
    }; 

    funcs[name](); 
})(); 
+0

來自@Doorknob of Snow的答案很好,得到了讚賞,但我接受你的回答,因爲它更簡潔明瞭。 –

2
eval(name)(); 

eval總是邪惡。它確實有它的用途。

如果你真的不喜歡的eval,嘗試存儲的對象,而不是你的變量:

(function() { 
    var vars = {}; 

    vars.myFunc = function(){ 
     alert("Hi!"); 
    }; 

    vars.name = "myFunc"; 
    //vars.myFunc(); // work 

    vars[vars.name]();  
})(); 
+0

eval始終從全球範圍呼叫......我無法使用它..我想! :-) –

+1

@ Jean-PhilippeMartin你試過了嗎?有用。 – Doorknob

+0

你說得對。但我指的是你對eval的評論... –

1

變化

myFunc = function(){ 

this.myFunc = function(){ 

那麼這將工作:

this[name](); 

演示:http://jsfiddle.net/B7QVj/6/

+0

對!謝謝 !但是爲什麼在我的例子中看不到myFunc? –

+0

我不會建議這個。在這種情況下,'this'實際上就是'window'(因爲這個函數沒有上下文被調用),所以'this.myFunc'只是讓'myFunc'全局。 (加上它不會在「嚴格模式」) –

+0

哦...火箭Hazmat你是對的。 (這個===窗口)是真的。再次,我會想,否則...我在一個匿名塊...爲什麼這是===窗口? –

相關問題