JavaScript调用函数who';s name是匿名作用域中函数的in字符串

JavaScript调用函数who';s name是匿名作用域中函数的in字符串,javascript,function,closures,Javascript,Function,Closures,这在javascript中可行吗?我尝试调用名为“name”的变量中的函数(抱歉!)。该函数不在全局范围内 (function () { var myFunc, name; myFunc = function(){ alert("Hi!"); }; name = "myFunc"; //myFunc(); // work (name)(); // do not work this[name](); // do

这在javascript中可行吗?我尝试调用名为“name”的变量中的函数(抱歉!)。该函数不在全局范围内

(function () {
    var myFunc, name;

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

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

})();
注意:我有一个JSFIDLE条目

eval
并非总是邪恶的。它确实有它的用途

如果您确实不喜欢eval,请尝试将变量存储在对象中:

(function () {
    var vars = {};

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

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

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

“局部作用域”没有像全局作用域那样的对象。您可以(也应该)创建自己的对象来保存您的功能:

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

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

    funcs[name]();
})();
改变

那么这就行了:

this[name]();

演示:

您几乎肯定想在这里使用对象。您能给我举个例子吗?别忘了,我的案例被简化为只显示我正在处理的问题。为什么不能先执行name=myFunc,然后执行name()?@AbhinavRanjan:因为
name
是一个字符串,可能来自其他地方。AbhinavRanjan:有时myFunc没有定义,所以我无法引用它。eval总是从全局范围调用。。。我不能用它。。我想!:-)@Jean Philipper Martin我没有评论评估。。。无论如何,我想说,
eval
并不总是全局范围。尝试使用eval代码,它就会工作。@Jean-PhilippeMartin:
eval
实际上在调用它的范围内运行(这就是为什么它可能很危险!)。对!!谢谢但是为什么不能像我在示例中声明的那样看到myFunc呢?我不建议这样做。在这种情况下,
这个
实际上是
窗口
(因为函数是在没有上下文的情况下调用的),所以
这个.myFunc
只是使
myFunc
全局化。(加上它在“严格模式”下无法工作)哦。。。火箭危险品你说得对。(此===窗口)为真。再说一次,我本以为不是这样的。。。我在一个匿名街区。。。为什么这是===窗口?@Jean PhilippeMartin:因为
这是运行函数的上下文。当匿名函数运行时,它的上下文为
null
。当函数具有
null
上下文时,它将成为
窗口
。请参阅:
此值不是由调用设置的。由于代码未处于严格模式,因此其值必须始终为对象,因此默认为全局对象
@Rocket Hazmat:I learn daily。谢谢你回答我的问题。来自雪之门把手的回答很好,并且得到了一张赞成票,但我接受你的回答,因为它更简洁,更中肯。
myFunc = function(){
this.myFunc = function(){
this[name]();