是否可以合并这两个功能

时间:2011-11-22 14:38:24

标签: javascript function

我有一堆看起来像这样的函数

'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'));
}

这是可能的还是我以错误的方式解决这个问题?

3 个答案:

答案 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') );
}