hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

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