美文网首页web前端开发让前端飞
JavaScript引用类型Function实例详解

JavaScript引用类型Function实例详解

作者: 88b61f4ab233 | 来源:发表于2018-11-13 21:24 被阅读0次

    Function类型

    函数是对象,函数名是指针:每个函数都是Function类型的实例。由于函数是对象,因此函数名是一个指向函数对象的指针,不会与某个函数绑定,一个函数可能会有多个名字。

    function getSum(a, b) {
      return a + b;
    }//前端全栈学习交流圈“866109386
    alert(getSum(2, 3));//5
    var copy = getSum;
    alert(copy(2, 3));//5
    getSum = null;
    alert(copy(2, 3));//5
    

    定义函数的方式有三种:函数声明、函数表达式、Function构造函数。

    Function构造函数接收任意数量的参数,前面的参数枚举了函数的参数,最后一个参数是函数体。一般不推荐使用Function构造函数定义函数。

    var getSum = new Function("a", "b", "return a + b";
    

    JavaScript没有函数重载的概念,若声明了两个同名函数,则后面的函数会覆盖前面的函数。

    由于函数名本身是变量,因此函数也可以作为值来使用,不仅可以传递一个函数作为参数,还可以将函数作为返回值。

    function callFunction(func, arguments) {
      return func(arguments);
    }//前端全栈学习交流圈:866109386
    function sayHello(name) {
      return "Hello, " + name;
    }
    var result = callFunction(sayHello, "Alice");
    alert(result);//Hello, Alice
    

    ①、函数声明

    function 函数名称(参数|可选) { 函数体 }

    例:

    function func1(){// 声明,程序的一部分
      function func() {// 声明,函数体的一部分
        ...//函数体
      }
    }
    

    ②、函数表达式

    function 函数名称|可选(参数|可选) { 函数体 }

    例1:

    var fun = function func() {};//表达式,赋值表达式的一部分
    

    例2:

    new function func(){};//表达式,new表达式
    

    例3:

    (function func(){});
    //表达式,包含在分组操作符——括号()内,括号()内只能包含表达式
    

    例4:

    [function func() {}];//表达式,数组初始化器内只能是表达式
    

    例5:

    1, function func() {};//表达式,逗号只能操作表达式
    

    ③、函数构造器

    函数构造器创建的函数的[[Scope]]属性仅包含全局对象。

    <script>
      var a = 1;
      func1();
      function func1() {
        var a = 2;
        var b = 3;
        var func2 = new Function("alert(a); alert(b);");
        func2();//1,b is not defined
      }
    </script>
    

    函数构造器创建的函数func2可以从全局对象中取得变量a,但全局对象中没有b,因此报错:b未定义。

    函数声明和函数表达式的区别

    1)函数声明在进入上下文阶段创建,在代码执行阶段就已经可用了,函数表达式则是在代码执行阶段才创建,所以函数声明可以提升,但函数表达式则不能。

    函数声明提升:

    func();//报错:func is not a function
    var func = function (){
      alert("Function expression");
    }
    

    2)函数声明影响变量对象VO,也就是存储在上下文的VO中的变量对象,函数表达式不影响变量对象VO,不存在于变量对象中,这意味着既不可能通过名称在函数声明之前调用它,也不可能在声明之后调用它。但是,函数表达式在递归调用中可以通过名称调用自身。
    例1:

    alert(func); //报错:func is not a function。定义之前不可用,因为它在代码执行阶段创建
    (function func() {});
    alert(func); //报错:func is not a function。定义之后也不可用,因为它不在变量对象
    

    例2:

    (function func(param) {
      if (param) {
        return;
      }
      func(true);//func可用,递归调用可以通过名称调用自身
    })();
    func(); // func is not a function,外部不可用
    

    3)函数声明只能出现在程序或函数体内,不能出现在表达式或块({ … })中,如if、while或for语句中。因为JavaScript无块级作用域,只有函数和全局作用域。 函数表达式出现在表达式的位置。

    函数声明:有的浏览器会返回if,而有的浏览器会返回else。

    if (true) {
      function func() {
        alert('if');
      }
    }
    else {
      function func() {
        alert('else');
      }
    }
    func();
    

    函数表达式:所有浏览器都返回if。

    var func;
    if (true) {
      func = function() {
        alert('if');
      };
    }
    else {
      func = function() {
        alert('else');
      };
    }
    func();
    

    相关文章

      网友评论

        本文标题:JavaScript引用类型Function实例详解

        本文链接:https://www.haomeiwen.com/subject/zwkrfqtx.html