变量提升与函数提升:

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <title>01_变量提升与函数提升</title>
  </head>

  <body>
    <!--
1. 变量声明提升
  * 通过var定义(声明)的变量, 在定义语句之前就可以访问到
  * 值: undefined
2. 函数声明提升
  * 通过function声明的函数, 在之前就可以直接调用
  * 值: 函数定义(对象)
3. 问题: 变量提升和函数提升是如何产生的?
-->
    <script type="text/javascript">

      /*
       面试题: 输出什么?
       */
      var a = 4;
      function fn() {
        console.log(a);
        var a = 5;
      }
      fn();


      /*变量提升*/
      console.log(a1); //可以访问, 但值是undefined
      var a1 = 3;

      /*函数提升*/
      a2(); // 可以直接调用

      // a3(); // Uncaught TypeError: a3 is not a function at 01_变量提升与函数提升.html: 39
      function a2() {
        console.log('a2()');
      }
      var a3 = function () { // 遵循变量提升而不是函数提升,只有用function直接定义的函数才是函数提升
        console.log("我是a3(),在我之前调用那是不可能的,必须在之后");
      }
      a3();

    </script>
  </body>

</html>

控制台运行结果:

 

=============Talk is cheap, show me the code==============