Можно ли объединить эти две функции - PullRequest
1 голос
/ 22 ноября 2011

У меня есть куча функций, которые выглядят так

'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 ]

4 голосов
/ 22 ноября 2011

Вы можете сделать функцию-создатель-функцию, которая была бы довольно близка

function speaker(message){ return function(caller){
    this.speak(this.randomOption(message + '_msg');
};}

{
    'tea': speaker('tea'),
    'chill': speaker('chill')
}

И если вы хотите избежать повторного ввода 'tea' и 'chill', вы можете использовать синтаксис подписки объектов [] вместе с некоторым циклом:

var funs = {};
var msgs = ['tea', 'chill'];
for(var i=0; i<msgs.length; i++){
    var msg = msgs[i];
    funs[msg] = speaker(msg);
}

Просто будьте осторожны с замыканиями внутри цикла, если вы хотите вместо этого написать встроенную функцию динамика.

1 голос
/ 22 ноября 2011
[ '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') );
}
1 голос
/ 22 ноября 2011

Вы можете передать имя функции как переменную?

'text': function (caller, functionName) {
     // get which function name was called in var lets call it fun
    this.speak(this.randomOption(functionName +'_msg'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...