标签:
//把函数当成值来使用的情况下,都可以使用匿名函数
//递归函数是在一个函数通过名字调用自身的情况下构成的
//使用函数声明来定义递归函数可能会出现问题
//这是一个经典的递归阶乘函数
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页。私有变量能够帮助理解为什么对象的构造函数长那个样子。初始化未经声明的变量,总是会创建一个全局变量。(这也是函数声明和函数表达式的不同之处,函数声明只能创建局部函数)
标签:
原文地址:http://www.cnblogs.com/timl525/p/4322695.html