結論：個人的には、関数宣言文で良いと思います。

まず、エラーの件について。 `SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.` を訳すと、「strict モードでは、関数宣言文は、トップレベルか他の関数の直下にしか書けない」ということみたいですね。if 文の中は、トップレベルではないから関数宣言文は書けない、と。関数定義式は、変数へ代入する"式"だから if 文の中にも書けるという理屈みたいです。

関数宣言文と関数定義式の違いについては、微妙な挙動の違いがあって、関数宣言文はスクリプトとか関数の先頭に巻き上げられるんですけど、関数定義式で定義された関数は、代入されるまで参照できないです。

また、@h13i32maru さんの
```
関数式よりも関数宣言の方が個人的にはオススメ。
もしくは名前付き関数式のほうがいいかも。
理由は関数宣言だと無名関数として扱われて、chromeのデバッガで追いづらいから。
```
は、正確には、
```
関数定義式よりも関数宣言の方が個人的にはオススメ。
もしくは名前付き関数定義式のほうがいいかも。
理由は、名前を省略した関数定義式だと、
内部的に無名関数として扱われて、Chrome のデバッガで追いづらいから。
```
かな。個人的には、名前付き関数定義式は、再帰とか書くときにしか使わないですね。

このあたりのドキュメントが参考になるかもです。

- [MDN: 関数と関数スコープ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope?redirectlocale=ja&redirectslug=JavaScript%2FReference%2FFunctions_and_function_scope)
- [[Javascript] 関数宣言の落とし穴 function foo ( ){..} と var foo = function ( ) {..} は動作が違うので要注意！](http://dqn.sakusakutto.jp/2009/01/javascript_function_foo_var_fo.html)
- OREILLY "JavaScript" 第六版 8 章「関数」

このくらいで勘弁〜