関数宣言と関数式の違い

JavaScript

/**
 * 次の例では、sayHello関数が定義される前に、実行が可能であることが確認できます。
 * 「関数宣言」、「関数式」、「巻き上げ(ホイスティング)」という言葉を用い、
 * その理由を説明してください。
 *
 *★解答
 * function命令で関数宣言された関数は、プログラムコンパイル時に解析・登録されるため、
 * 宣言しているコードの前で実行分を書いても正しく呼び出せる。
 * このことを巻き上げ(ホイスティング)という。
 *
 * ただし、関数式・functionコンストラクタを用いた関数宣言では、実際のコード実行時に式が評価されるため、
 * 宣言しているコードの前でその関数を呼び出すことは出来ない。
 */

var sayYo = function() {
 console.log("Yo!");
}

sayYo();		// 呼び出し成功
sayHello();	// 呼び出し成功(なぜ?)
sayBye();	  // 呼び出し失敗(この理由は分かりますよね?)

var sayBye = function() {
 console.log("Bye");
}

function sayHello() {
 console.log("Hello!");
}