2011-11-22 202 views
1

我有一堆看起来像这样是否有可能这两个功能

'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

@Joachim绍尔感谢纠正我的文法/拼写 – mcgrailm

回答

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

@mcgrailm'Array.prototype.forEach'是ES5的事情。如果你想兼容没有它的浏览器(*咳嗽* IE8-),你可以用一个简单的for循环替换它。代码本身应该可以正常工作。 – Zirak

1

您可以将函数名称作为变量传递?

'text': function (caller, functionName) { 
    // get which function name was called in var lets call it fun 
    this.speak(this.randomOption(functionName +'_msg')); 
} 
4

你可以做一个函数制造商的函数,是会得到相当接近

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循环。

相关问题