クロージャーがなんとなく

クロージャーがよくわからないでいる。

function hoge() {
  //関数の中に関数を書く
  var fuga = function () { alert("abc"); };

  //関数を実行するには
 fuga();

  //しかし定義するときに実行できる
  var fuga = function () { alert("abc"); }();

  //というか、 fuga なんて作らなくてもいい
  return function () { alert("abc"); }();

}
//結局、最後の行が、よく見慣れた形になる。 う〜〜ん。難しい。