【JavaScript】Function类型

  JavaScript中,每个函数都是Function类的一个实例。

  也就是说每一个定义的函数名都是指向Function类型的一个实例。

  函数名中存放的是函数的指针(Function类型实例指针)。

  可以使用Function的构造函数实现,最后一个参数被视为函数体,如:

  var sum = new Function("num1","num2","return num1+num2");   //不推荐

  

1.没有重载

  因为函数名中存放的是指针,重新定义相同的函数名时,不管参数签名是否一致,都会覆盖掉之前所存的函数。

  不存在重载。

  但是函数的重载还是可以实现,JavaScript中,当函数传入的参数与函数签名数量不相同时,仍可以运行(在函数体中加入判断参数是否存在的语句,避免出错)。

  这样也可以实现函数的重载。

 

2.函数声明与函数表达式区别

  JavaScript在编译时会将函数的定义提前,即在调用之后才定义,也可以实现函数体的内容,如:

    alert(sum(10,10);        //输出20

    function sum(num1, num2){
      return num1 + num2;

    }

  

  而当使用函数的表达式时,编译到表达式时才会定义函数,因此如果像上例输出,会报错,如:

    alert(sum(10,10);        //unexpected identifier

    var sum = function(num1, num2){

      return num1 + num2;

    }

 

3.作为值的函数

  因为函数名中存放的是指针,因此函数可以作为一个参数传入另外一个函数内部,如:

    function callSomeFunction(someFunction, someArgument){

      return someFunction(someArgument);

    }

 

    function add10(num){

      return num + 10;

    }

 

    var result1 = callSomeFunction(add10, 10);

    alert(result1);        //20

 

    function getGreeting(name){
      return "Hello, " + name;

    }

 

    var result2 = callSomeFunction(getGreet, "Nicholas");

    alert(result2);

 

    注意:使用不带圆括号的函数名是访问函数的指针,而非调用函数。

 

4.函数内部属性

    函数内部有两个特殊对象:arguments和this。

    arguments主要用途是保存传入的参数,第一个参数为arguments[0],第二个为arguments[1]以此类推。

    当使用参数名改变参数的值时,arguments对应的值也改变,但不代表这两个指向同一个东西。

    arguments对象有一个名为callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

    

    this对象与C#和Jaca中的大致类似。

    函数对象的属性caller,保存着调用当前函数的函数的引用。

5.函数内部方法

function.length();

function.apply();        P116

function.call();     P117

function.bind()    p118

原文地址:https://www.cnblogs.com/junxcode/p/5021718.html