《悟透JavaScript》学习札记三之函数的魔力

来源:互联网 发布:小学生出题软件 编辑:程序博客网 时间:2024/05/01 11:58

1.函数声明:

<!--定义式函数声明-->
  <script type="text/javascript">
   function myfunc(){ alert("Hello definition");};
   myfunc();
   alert(typeof(myfunc));
  </script>
  <!--变量式函数声明-->
  <script type="text/javascript">
   var myfunc = function(){ alert("Hello variable");};
   myfunc();
   alert(typeof(myfunc));
  </script>

2.声明方式差异比较

<!--变量式函数声明-->
  <script type="text/javascript">
   var myfunc = function(){ alert("Hello variable");};
   myfunc(); //第一次调用,输出Hello variable
   myfunc = function(){ alert("Yeah variable");};
   myfunc(); //第二次调用,输出HeYeah variable
  </script>

然而:
<!--定义式函数声明-->
  <script type="text/javascript">
   function myfunc(){ alert("Hello definition");};
   myfunc(); //第一次调用
   function myfunc(){ alert("Yeah definition");};
   myfunc(); //第二次调用
  </script>

两次输出结果均为Yeah definition

原因:JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段的分析执行的。而且,在同一段程序的分析执行中,定义式的函数语句会被提取出来优先执行,然后再按顺序执行其他语句代码。也就是说,在第一次调用myfunc之前,第一个函数定义的代码逻辑,已被第二个定义语句覆盖了,所以两次执行都是最后一个函数逻辑了。

另附:
// 定义式函数声明
alert(SumDef(1, 2)); // output: 3
  function SumDef(num1, num2){
   return num1 + num2;
  }
// 变量式函数声明
  alert(SumVar(2, 3)); // 没有结果,下面也不会执行
  var SumVar = function(num1, num2){
   return num1 + num2;

  }
  alert(SumVar(3, 4));

原因: JavaScript解析器在解释代码的时候会首先读取函数声明,使其在执行其他代码之前可以得到访问。而对于变量式函数声明,解析器会把其当做变量赋值语句,从而
alert(SumVar(2, 3)); 时就相当于调用了一个不存在的SumVar函数,导致出错,下面代码也不会执行。