在javascript中动态调用内部函数

时间:2011-08-04 03:03:01

标签: javascript

是否可以动态调用内部函数(通过它的名称)?

e.g。

function a(){
    function b(){..}
    var funcName = "b";
    //calling the function b somehow using funcName
}

我知道使用eval是可能的,但我宁愿不使用eval,如果b是全局函数,我可以使用window [funcName]或global [funcName] ...

4 个答案:

答案 0 :(得分:2)

您希望通过名称(b)神奇地访问"b",而不会在单独的结构中记录名称b

全局变量是全局对象的属性,通常通过Web环境中的标识符window访问,这是正确的。有趣的是,它实际上是如何工作的,因为window是指向自身的全局对象的属性,但是,这是偏离主题的。

局部变量也是对象的属性 - 调用对象。该对象在通话期间暂时存在。如果您可以直接访问调用对象,那么能够说出theCallObject[funcName]之类的内容,因为嵌套函数仍然是局部变量,尽管已经悬空。唉,这个对象不能直接访问,所以你基本上必须恢复到前面答案中显示的技术。

以下是一个SO问题:How to output call object in javascript?

我想可以编写一个带有扩展名的JS引擎,允许访问调用对象,就像Mozilla给我们的非标准__proto__一样。

答案 1 :(得分:1)

好吧,如果你能用不同的方式宣布它,那就不那么难了:

function a(){
    this.b = function() {...};

    // dynamic access
    var funcName = "b";
    this[funcName]();

    // still need static access?
    var b = this.b;
    b();
}

当然,你可以将它混合起来。但函数只是对象(a b),因此可以分配,移动,甚至包含实例成员。

答案 2 :(得分:1)

OverZealous答案中的一个变体,它不会与this混淆:

function a(){
    function b(){..}
    var internalFuncs = {"b": b}
    var funcName = "b"
    internalFuncs[funcName]()
}

快乐的编码。

答案 3 :(得分:1)

另一种方法:

var a = (function() {
    return {
        b: function() { alert("b"); },
        c: function() { alert("c"); },
        d: function() { alert("d"); }
    }
})();

a["b"]();

小提琴:http://jsfiddle.net/raSKW/