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