callで関数を即時実行すると何が嬉しいのか(と、ちょっとおまけ)

callを使うとstrictモードのときに嬉しい

underscore.js(1.6.0)とかって全体を即時関数でラップするときに、ただの括弧じゃなくてcallを使ってるんですよね。
これなんでやろ?と思って調べたら、strictモードを有効にしたときに即時関数内のthisがundefinedになっちゃうよ、っていう挙動に対応する為みたい。
CoffeeScriptを3時間で理解するための10のポイント(1)-(3)
CoffeeScriptの記事だけどcallとstrictモードについての説明が載ってる。

// 通常
(function() {
  console.log(this); // windowオブジェクトを出力
})();

// 関数内にstrictモード適用
(function() {
  'use strict';
  console.log(this); // undefinedを出力
})();

// callを使ってみる
(function() {
  'use strict';
  console.log(this); // windowオブジェクトを出力
}).call(this);

へー、なるほど...。

おまけ(即時関数の括弧がワカラン)

あと、underscore.jsは閉じ括弧の位置が↓こうなってるんだけど、

(function(){ /* 処理いろいろ... */ }.call(this));

これって↓こんな感じで閉じ括弧のあとにcallを記述してもいいんですよね。

(function(){ /* 処理いろいろ... */ }).call(this);

でも、閉じ括弧を取ってしまうとSyntaxErrorになる...。

function(){ /* 処理いろいろ... */ }.call(this);

ちなみにcall使わない即時関数でも同じ挙動になる。なんだこれは。
こっちも調べてみたらありました。ありがたやありがたや。
即時関数の別の書き方いろいろ
そうか、関数宣言か関数式かの違いなのか!
それにしても関数式として認識させる記述なら、即時関数として扱えるっていうのはすごく面白いなーと思った。