0

考虑这段代码:

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

    b();
})();

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

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

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

4

2 回答 2

4

在这种情况下有可能吗?

仅通过使b函数成为对象的属性:

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

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

您需要事先知道函数的名称。

于 2013-09-12T12:49:30.837 回答
2

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

不,函数声明具有相同的作用域规则,因此即使在理论上也是不可能的(当然,除非我们谈论闭包)。

如果 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。

于 2013-09-12T12:52:15.963 回答