是否有可能这两个功能
问题描述:
我有一堆看起来像这样是否有可能这两个功能
'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'));
}
功能合并这是可能的还是我以这种错误的方式去做?
答
[ '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'));
}
+0
@mcgrailm'Array.prototype.forEach'是ES5的事情。如果你想兼容没有它的浏览器(*咳嗽* IE8-),你可以用一个简单的for循环替换它。代码本身应该可以正常工作。 – Zirak
答
您可以将函数名称作为变量传递?
'text': function (caller, functionName) {
// get which function name was called in var lets call it fun
this.speak(this.randomOption(functionName +'_msg'));
}
答
你可以做一个函数制造商的函数,是会得到相当接近
function speaker(message){ return function(caller){
this.speak(this.randomOption(message + '_msg');
};}
{
'tea': speaker('tea'),
'chill': speaker('chill')
}
如果你想避免重新输入“茶”和“寒意”,你可以使用[]
对象 - 带有某种环路一起下标语法:如果你想写扬声器功能inline将
var funs = {};
var msgs = ['tea', 'chill'];
for(var i=0; i<msgs.length; i++){
var msg = msgs[i];
funs[msg] = speaker(msg);
}
只是要小心封盖,内-for循环。
@Joachim绍尔感谢纠正我的文法/拼写 – mcgrailm