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

Javascript 使用动态名称调用嵌套函数,javascript,syntax,ecmascript-5,Javascript,Syntax,Ecmascript 5,考虑以下代码: (函数a(){ //嵌套函数 函数b(){ console.log(“Works!”); } b(); })(); 这段代码可以工作,但是如果名称在字符串中(即动态),是否可以(理论上)调用b() 如果在全局范围内声明b(),我们可以使用window[stringContainingName]()。这种情况有可能吗 这只是一个理论问题!我知道这样的代码设计很糟糕。 这种情况有可能吗 仅通过使b函数成为对象的属性: (function a(name) { var fns

考虑以下代码:

(函数a(){
//嵌套函数
函数b(){
console.log(“Works!”);
}
b();
})();
这段代码可以工作,但是如果名称在字符串中(即动态),是否可以(理论上)调用
b()

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

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

这种情况有可能吗

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

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

    // possibly secure by `if (fns.hasOwnProperty(name))`
    fns[name]();
})("b");
您需要事先知道中函数的名称

这种情况有可能吗

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

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

    // possibly secure by `if (fns.hasOwnProperty(name))`
    fns[name]();
})("b");
您需要事先知道中函数的名称

这段代码可以工作,但是如果 名称是否在字符串中(即动态)

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

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

是的,当然了:这个

(function a() {
    // Nested function
    window.b = function() {
        console.log("Works!");
    }
    b();
})();
b(); // or window['b'](), or window.b()
。。。将记录两次“工作”
。我在这里使用了显式全局对象,因为在严格模式下,直接赋值给
b
,而不声明它(使用
b=function()…
而不是
window.b=function()…
)将导致引用错误

这段代码可以工作,但是如果 名称是否在字符串中(即动态)

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

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

是的,当然了:这个

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

。。。将记录两次“工作”。我在这里使用了显式全局对象,就像在严格模式下直接赋值到
b
而不声明它(使用
b=function()…
而不是
window.b=function()…
)会导致引用错误。

尝试时会发生什么P@Jite我应该尝试什么?有一个解决方案。但是我不能发布它,因为我的投票方式是:
fname='b';eval(fname+'();')
使用
eval('b()')
window['b']()(
)好多少?@chumkiu在这种情况下,我会给你一个+1(这只是一个理论问题,因此误用eval()并不重要);)谢谢您的评论。尝试时会发生什么P@Jite我应该尝试什么?有一个解决方案。但是我不能发布它,因为我的投票方式是:
fname='b';eval(fname+'();')
使用
eval('b()')
window['b']()(
)好多少?@chumkiu在这种情况下,我会给你一个+1(这只是一个理论问题,因此误用eval()并不重要);)谢谢你的评论。我不完全理解最后一句话。还有什么方法可以声明一个函数(嵌套在另一个函数中)出现在全局范围内?只要
b=function()而不是
window.b
。这绝对不是一个好习惯,但它确实在非严格模式下工作。感谢您的澄清,我忘记了不使用var;)我不完全理解最后一句话。还有什么方法可以声明一个函数(嵌套在另一个函数中)出现在全局范围内?只要
b=function()而不是
window.b
。这绝对不是一个好习惯,但它确实在非严格模式下工作。感谢您的澄清,我忘记了不使用var;)两个答案都不错,但决定接受哪一个有点困难,因为我的问题没有“真正”的解决方案。谢谢你的回复:)两个答案都很好,但决定接受哪一个有点困难,因为我的问题没有“真正”的解决方案。谢谢你的回复:)