即時関数あれこれ
JavaScriptの即時関数はいろんな書き方が出来る
// よく見かける即時関数
(function () {
// ...
})();
// underscore.jsの即時関数
(function () {
// ...
}).call(this);
underscore.js
の即時関数
underscore.jsは何故callで関数を呼び出しているのかというと
JavaScripstのstrictモードでは関数内のthis
がundefined
になる
e.g.
'use strict';
// よく見かける即時関数
(function () {
console.log(this); // undefined
})();
// underscore.jsの即時関数
(function () {
console.log(this); // 即時関数の外のthisが表示される
}).call(this);
strictモードでない場合はどちらの記述でも関数内のthis
は実行時のthis
が引き渡されるので
strictモードとそうでない場合の振る舞いの違いを吸収するため
call(this)
で無名関数を呼んでいるのだと思われる
蛇足
grunt-contrib-coffee
などでCoffeeScriptから変換されるJavaScriptも(function () {}).call(this);
にラップされている
たぶん同じ理由なんだと思う