underscore関数のcontext引数について

underscore.jsで使用できる関数の中には、contextというオプション引数を指定できるものがあります。

(例)
map_.map(list, iteratee, [context])
each_.each(list, iteratee, [context])

このcontextが何の役に立つのかがわからなかったのですが、こちらのサイトを読んで理解することができました。

iteratee関数の中でthisが指すオブジェクトを指定するそうです。
つまり、contextオブジェクトの文脈でthisを表すということです。

まあ、こんなことを言ってても何のことかわからないだろうし、私も忘れてしまいそうなので、サンプルスクリプトを書きました。

(ファイル名) sample.js

//node.jsにunderscoreをインストールすしなければならない。
var _u = require('underscore');

var langs = ['JavaScript', 'node.js', 'Python'];

var Programmer = function(name) {
	this.name = name;
	this.profile = function() {
		return this.name;
	};
	this.work = function(lang) {
		console.log(this.name + 'は、' + lang +
					'でプログラムを書きます。');
	};
};

work = function(lang) { //workはグローバルプロパティ
	console.log(lang + 'は楽しいな。');
};

var pg = new Programmer('太郎');

_u.each(langs, function(element) {
	this.work(element); //thisは、pgオブジェクトを指す。
}, pg);

これを実行すると、

$ node sample.js
太郎は、JavaScriptでプログラムを書きます。
太郎は、node.jsでプログラムを書きます。
太郎は、Pythonでプログラムを書きます。

となります。

次に、_u.eachメソッドに渡す引数から、pgを削除します。
すなわち、

_u.each(langs, function(element) {
	this.work(element); //thisは、グローバルプロパティを指す。
});

そして実行すると、

$ node sample.js
JavaScriptは楽しいな。
node.jsは楽しいな。
Pythonは楽しいな。

となり、thisはグローバルプロパティのwork(という関数)を指すことになります。