JavaScriptでRubyのyield的なもの?
今日は月に一度の会社の勉強会。
毎年テーマを決めるのですが、今年のテーマはJavaScript。
同じ課の中でJavaScriptに興味がある5人で活動中です。
それで今日の勉強会で後輩が、
「JavaScriptって関数の引数で関数を渡せるんですよね? これってどんなメリットがあるんですかね?」
と聞いてきたのですが、私も即答できず。(汗)
しかし、ちょうど JavaScript: The Good Parts -「良いパーツ」によるベストプラクティス に
いいサンプルがあったので、後輩に教えると、
「なるほど!JavaScriptアツいっすね!」
と楽しそうに話してくれました。
こういうメンバーがいるとこっちまでモチベーションがあがりますね。
下記はそのとき教えたコードを私なりに少しだけ変更してみたものです。
Rubyでいうところのyieldに似ている気がします。
//メソッドを追加するためのmethodメソッド
Function.prototype.method = function (name, func){
if (!this.prototype[name]){
this.prototype[name] = func;
}
}//配列展開用のメソッドをArrayオブジェクトに追加
// メソッド名はreduce
// 引数fは関数
// thisは配列自身
Array.method('reduce', function (f, value) {
var i;
for (i = 0; i < this.length; i += 1) {
value = f(this[i], value);
}
return value;
});//実際に使ってみる
//数値配列を生成
var data = [4, 8, 15, 16, 23, 42];//足し算用関数
var add = function (a, b) {
return a + b;
}//掛け算用関数
var mult = function (a, b) {
return a * b;
}//dataのreduceメソッドにaddを渡す
var sum = data.reduce(add, 0); // sum = 108//dataのreduceメソッドにmultを渡す
var mult_sum = data.reduce(mult, 1); // mult_sum = 7418880