使用动态名称调用嵌套函数

时间:2013-09-12 12:44:44

标签: javascript syntax ecmascript-5

考虑以下代码:

(function a() {
    // Nested function
    function b() {
        console.log("Works!");
    }

    b();
})();

此代码有效,但如果名称在字符串内(即动态),是否可以(理论上)调用b()

如果在全局范围内声明b(),我们可以使用window[stringContainingName]();。在这种情况下有可能吗?

这只是一个理论问题!我知道这样的代码设计不好。

2 个答案:

答案 0 :(得分:4)

  

在这种情况下有可能吗?

仅将b函数设为对象的属性:

(function a(name) {
    var fns = {
        b: function b() {
            console.log("Works!");
        }
    };

    // possibly secure by `if (fns.hasOwnProperty(name))`
    fns[name]();
})("b");

您需要事先了解这些功能的名称。

答案 1 :(得分:2)

  

此代码有效,但是(理论上)可以调用b()if   名字是在一个字符串里面(即动态的)?

不,函数声明对范围有相同的规则,所以即使在理论上它也是不可能的(除非我们谈论闭包,当然)。

  

如果b()将在全局范围内声明,我们可以使用   windowstringContainingName;在这种情况下有可能吗?

是的,当然:这......

(function a() {
    // Nested function
    window.b = function() {
        console.log("Works!");
    }
    b();
})();
b(); // or window['b'](), or window.b()

...将记录'Works'两次。我在这里使用了显式全局对象,因为在严格模式下直接分配给b而没有声明它(使用b = function() ...而不是window.b = function() ...)将导致ReferenceError。