码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript高级程序设计:第七章 - 函数

时间:2015-03-09 09:19:07      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

六、函数表达式

  //把函数当成值来使用的情况下,都可以使用匿名函数
  1. 递归
    //递归函数是在一个函数通过名字调用自身的情况下构成的
    //使用函数声明来定义递归函数可能会出现问题
    //这是一个经典的递归阶乘函数
    
    function factorial(num) {
      if (num<1){
        return 1;
      }else{
        return num * factorial(num-1);
      }
    }
    //使用函数声名来定义该递归函数时,函数名和函数体会产生耦合。
    //当其他指针指向该函数体的时候,由于执行anotherFac()必须执行factorial,而factorial变量已经设为null,就会导致错误
    var anotherFac = factorial;
    factorial = null;
    anotherFac(5);
    //可以用arguments.callee来解决该问题,不在赘述
    //也可以将命名函数表达式赋值给变量factorial,这种解决办法在严格模式下依然有效
  2. 闭包

    闭包是指有权访问另一个函数作用域中的变量的函数(最常见的表现形式是从一个函数中返回另一个函数),容易和匿名函数搞混。在函数被调用时,会创建一个执行环境及相应的作用域链。由该函数的arguments和其他命名参数的值初始化的活动对象排在作用域链的第一位,外部函数的活动对象则始终处于第二位,而最外层则是全局变量对象。一般情况下当函数执行完毕后,拒不活动对象就会被销毁,内存中仅保存全局变量对象,但是闭包的情况由有所不同。闭包会携带包含它的函数作用域,比其他函数占用更多内存。所以要慎用闭包。凡是匿名函数的this都是指向window。Javascript没有块级作用域的概念,所以在语句块中定义的活动变量的范围会扩大到整个函数体。可以用匿名函数(function(){})()来避免这种情况。解释(function(){})()的问题在185页。私有变量能够帮助理解为什么对象的构造函数长那个样子。初始化未经声明的变量,总是会创建一个全局变量。(这也是函数声明和函数表达式的不同之处,函数声明只能创建局部函数

JavaScript高级程序设计:第七章 - 函数

标签:

原文地址:http://www.cnblogs.com/timl525/p/4322695.html

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