码迷,mamicode.com
首页 > 其他好文 > 详细

函数表达式

时间:2020-10-12 20:42:12      阅读:50      评论:0      收藏:0      [点我收藏+]

标签:情况   数通   表达式   OLE   出错   null   turn   ons   nts   

JS定义函数

  • 方式有两种:一种是函数声明另一种就是函数表达式

函数声明

  • 函数声明可以定义命名的函数变量
  • 变量声明必须以“function”开头。
  • 函数名在自身作用域和父作用域内是可获取的。
  • 具有函数声明提升

函数表达式

  • 将函数定义为表达式语句(通常是变量赋值)的一部分。
  • 通过函数表达式定义的函数可以是命名的,也可以是匿名的。
  • 函数表达式不能以“function”开头。
  • 函数名在作用域外是不可获取的。

 

// 函数声明
    //关于函数声明,它的一个重要特征就是函数声明提升
    fname()
    function fname() {
      // 函数体
      console.log("hi");
    }
    
    // 函数表达式
    // fn();// 出错:  fn is not a function
    var fn = function () {
      console.log("hello");
    }

递归

  • 递归函数是在一个函数通过名字调用自身的情况下构成的
  • arguments.callee 是一个指向正在执行的函数的指针
 /* 
      递归
     */
    //  实现一个经典的递归阶乘函数
    function factorial(num) {
      if (num <= 1) {
        return 1;
      } else {
        // return num * factorial(num - 1);
        // 改进 知道,arguments.callee 是一个指向正在执行的函数的指针
        return num * arguments.callee(num - 1)
      }
    }

    //  如果函数赋予另一个变量,再factorial = null 会出错
    // 改进 知道,arguments.callee 是一个指向正在执行的函数的指针

    var anotherFactorial = factorial;
    factorial = null;
    // console.log(anotherFactorial(4)); //出错! factorial is not a function
    console.log(anotherFactorial(4)); //24
    /* 
        但在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误
        改进:
    */
    var factorial2 = (function f(num) {
      if (num <= 1) {
        return 1;
      } else {
        return num * f(num - 1);
      }
    });
    console.log(factorial2 instanceof Function);//true
    console.log(typeof(factorial2));//function
    var anotherFactorial2 = factorial2;
    factorial2 = null;
    console.log(anotherFactorial2(4));//24

以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。即便把函数
赋值给了另一个变量,函数的名字f 仍然有效,所以递归调用照样能正确完成。

 

闭包

  • 闭包是指有权访问另一个函数作用域中的变量的函数
  • 创建闭包的常见方式,就是在一个函数内部创建另一个函数

 

函数表达式

标签:情况   数通   表达式   OLE   出错   null   turn   ons   nts   

原文地址:https://www.cnblogs.com/chunying/p/13804042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!