モジュール内での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とかしようとしてこうなってなんぞと思った。