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