2013-12-19 39 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你是对的。 (这个===窗口)是真的。再次,我会想,否则...我在一个匿名块...为什么这是===窗口? –

相关问题