是否可以动态调用内部函数(通过它的名称)?
e.g。
function a(){
function b(){..}
var funcName = "b";
//calling the function b somehow using funcName
}
我知道使用eval是可能的,但我宁愿不使用eval,如果b是全局函数,我可以使用window [funcName]或global [funcName] ...
答案 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"]();