モジュール内でのthis

nodeでrequireされたモジュール内のthisはmodule.exportsになる

console.log(this === module.exports); // true

なのでthisに値を設定するのはmodule.exportsに設定するのと基本的には同じ。

ただしスコープつくってしまうとthisが変わるので注意

(function() {
  console.log(this); // => global
})();

なので

// test.js
this.foo = 'bar';

だと

var o = require('./test.js');
console.log(o.foo); // => bar

なんだけど

// test.js
(function() {
  this.foo = 'bar';
})();

だと

var o = require('./test.js');
console.log(foo); // => bar

となってグローバルにfooが定義される。

普通node用のモジュール書くときはこういう書き方しないので大丈夫だけど、ブラウザ用に書かれたJSをrequireとかしようとしてこうなってなんぞと思った。