考虑以下代码:
(function a() {
// Nested function
function b() {
console.log("Works!");
}
b();
})();
此代码有效,但如果名称在字符串内(即动态),是否可以(理论上)调用b()
?
如果在全局范围内声明b()
,我们可以使用window[stringContainingName]();
。在这种情况下有可能吗?
这只是一个理论问题!我知道这样的代码设计不好。
答案 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。