所以我有以下伪Javascript代码:
var Class = (function(window, document, $) {
function meth_1()
{
//some code
}
function meth_2()
{
//some code
}
function meth_3()
{
//some code
}
function meth_4()
{
//some code to call other three functions dynamically
}
Class = {
meth_1: meth_1,
meth_2: meth_2,
meth_3: meth_3,
meth_4: meth_4
};
return Class;
})(window, document, jQuery);
在meth_4
函数中,我想通过将函数名称作为字符串传递来动态调用其他3个函数。我怎么能这样做?!
在这个related StackOverflow question中,答案提供了如何在窗口范围内完成此解决方案的解决方案,即window[function_name]()
。但是,我想知道如何在我的特殊情况下做到这一点。
感谢。
修改
我选择的答案可行。您还可以执行以下操作:
var Class = (function(window, document, $) {
var meth_func = {
meth_1: function(){/**your code**/},
meth_2: function(){/**your code**/},
meth_3: function(){/**your code**/}
}
function meth_4(func_name)
{
meth_func[func_name]();
}
Class = {
meth_4: meth_4
};
return Class;
})(window, document, jQuery);
如果您希望将这三个函数动态调用私有,这可能会更好。
答案 0 :(得分:2)
由于您希望在对象范围而不是窗口范围内使用括号表示法调用函数,因此可以使用this
代替window
:
function meth_4()
{
this["meth_1"]();
this["meth_2"]();
this["meth_3"]();
}
答案 1 :(得分:0)
我不知道你为什么会这么想(同时'Class'作为变量名也不好),但可以这样做:
var Class = (function (window /*, ... */) {
return {
func1: function () {console.log('1')}
, func2: function () {console.log('2')}
, func3: function () {console.log('3')}
, func4: function (funcName) {
console.log('4+')
this[funcName]()
}
}
})(window)
Class.func4('func3')
答案 2 :(得分:0)
这是一个可以做你想要的实现。如果传递一个字符串,它将只查找相应的函数并执行它。然而,由于JS中的函数是不受限制的对象,因此它们可以自我传递,并表明我已经将功能扩展了一些与您要求的相比。如果你传递一个函数(实际上除了一个字符串之外的任何东西),它将(尝试)调用它
meth_4 = function(fun){
if(typeof fun === 'string'){
this[fun](args.slice(1));
} else { //assuming it's a function
if(arguments.length == 1)
fun.call(this,[])
} else {
fun.apply(this,arguments.slice(1))
}
}
}
JavaScript对象是或者可以被视为键/值对集合。任何函数或属性都可以以两种语义上等效的方式访问
obj.key
或obj["key"]
在某些情况下只能使用后者。例如。如果属性被调用property name
,则您无法执行obj.property name
但可以执行obj["property name"]