我有一堆看起来像这样的函数
'tea' : function (caller) {
this.speak(this.randomOption('tea_msg'));
},
'chill' : function (caller) {
this.speak(this.randomOption('chill_msg'));
},
我想要的是将它们合并到像这样的东西
'tea' ,'chill': function (caller) {
// get which function name was called in var lets call it fun
this.speak(this.randomOption(fun +'_msg'));
}
这是可能的还是我以错误的方式解决这个问题?
答案 0 :(得分:4)
你可以创建一个非常接近的函数制作者函数
function speaker(message){ return function(caller){
this.speak(this.randomOption(message + '_msg');
};}
{
'tea': speaker('tea'),
'chill': speaker('chill')
}
如果你想避免重新输入'tea'和'chill',你可以使用[]
object-subscripting语法和某种循环:
var funs = {};
var msgs = ['tea', 'chill'];
for(var i=0; i<msgs.length; i++){
var msg = msgs[i];
funs[msg] = speaker(msg);
}
如果你想内联地编写扬声器功能,请注意闭包内部的循环。
答案 1 :(得分:1)
您可以将函数名称作为变量传递吗?
'text': function (caller, functionName) {
// get which function name was called in var lets call it fun
this.speak(this.randomOption(functionName +'_msg'));
}
答案 2 :(得分:1)
[ 'tea', 'chill', 'elephant', 'moose' ].forEach(function (val) {
//creating a closure so `val` is saved
(function (val) {
obj[ val ] = function ( caller ) {
this.speak( this.randomOption(val + '_msg') );
};
}(val));
});
您还可以编写通用的say
函数:
say : function ( caller, type ) {
this.speak( this.randomOption(type + '_msg') );
}