javascript函数

1、function对象的加载
每个函数都是Function对象的实例,而且与其他引用类型具有相同的属性和方法。函数是对象,函数名实际上是指向函数对象的一个指针,不会与函数绑定。
函数名是一个指向函数的指针,所以不会有重载同时参数传递也是一个arguments对象来保存所有参数,无法通过签名来判断是否重载
 
在函数加载中解析器会预先读取函数的声明,以至于所有代码都能够使用到函数;而如果是声明对象的话则是要按照顺序进行解析
<html>
  <head>
    <title>jsTest</title>
    <script type="text/javascript">
    /*
      这个显然说明js在加载函数时,是先加载函数声明后保证在任何地方都能够使用。
     */
      alert(sum(100,200));
      function sum(num1,num2)
      {
        return num1+num2;
      };
      /*
      下面的语句就会出现错误,因为解析器是下加载函数声明,而var sum=function(sum1,sum2)不是函数声明,是变量sum的初始化对象
       */
      alert(sum(100,200));
      var sum=function(num1,num2)
      {
        reutrn sum1+sum2;
      };
    </script>
  </head>
  <body>
  </body>
</html>
 
2、函数实际上也是一个变量,所以函数可以作为另一个函数的参数,也可以作为返回值。
 
<html>
  <head>
    <title>jsTest</title>
    <script type="text/javascript">
    /*
      显然desc函数作为sum函数的一个参数,返回值也是desc函数运行之后的返回值
     */
      alert(sum(desc,100,200));
      function desc(num1,num2)
      {
        if(num1>num2)
        {
          return num1-num2;
        }
        else{
          return num2-num1;
        }
 
      }
      function sum(desc,num1,num2)
      {
        return desc(num1,num2);
      }
    </script>
  </head>
  <body>
  </body>
</html>
3、函数的内部属性:arguments和this
     arguments属性是一个类似数组对象,主要用于保存函数的参数。arguments还有一个callee的属性,该属性可以在递归的时候解除函数体与函数名的紧密耦合。
     arguments.callee和函数名指向的是同一个函数实体,即
function factority(num)
{
     if(num<=1)
     {
          return 1;
     }
     
     return num*arguments.callee(num-1);//在这儿arguments相当于函数factority的别名,这条语句等价于num*factority(num-1);
}
 
<html>
  <head>
    <title>jsTest</title>
    <script type="text/javascript">
    /*
      显然desc函数作为sum函数的一个参数,返回值也是desc函数运行之后的返回值
     */
      alert(factorial(5));
      function desc(num1,num2)
      {
        if(num1>num2)
        {
          return num1-num2;
        }
        else{
          return num2-num1;
        }
 
      };
      function sum(desc,num1,num2)
      {
        return desc(num1,num2);
      };
      function factorial(num)
      {
        if (num<1) {return 1}
        else
          {
            return num*arguments.callee(num-1);
          }
      }
    </script>
  </head>
  <body>
  </body>
</html>
4、函数的属性length表示希望接受的参数的数目,而不是实际接收的参数个数。对于对象而言, prototype属性是用来保存方法的。
    apply()和call()方法用来改变函数的作用域
 
函数通过调用call方法可以在不同的作用域中运行
var color="red";
var o={color:"blue"};
function saycolor()
{
     alert(this.color):
}
saycolor.call(this);//red
saycolor.call(window);//red
saycolor.call(o);//blue
 
call函数用来定义作用域的,由于是在全局执行环境下运行,所以this指代的是window,而更改为o之后作用域对象就是o
 
     bind()方法会创建一个函数的实例,然后并将作用域传递给新实例,也可以带有一个作用域的参数传递给新实例
 
var color="red";
var o={color:"blue"};
function sayColor()
{
     alert(this.color);
}
sayColor1=sayColor.bind(o);//blue,这个将变量o作为执行环境的变量对象传递新函数实例
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/Black-Cobra/p/7416432.html