一、递归
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * factorial(num-1);
}
}
通过以下方式就会出错
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //出错!
第一种改进方法:(在严格模式不能通过脚本访问arguments.callee)
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
第二种改进方式:
var factorical = (function f(num){
if(num <= 1){
return 1;
}else{
return num * f(num-1);
}
});
二、闭包
闭包是说一个函数可以访问另一个函数的作用域中的变量。
for(var i=0; i<2; i++){
setTimeout(function(){
console.log(i);
},0);
}
上面这段代码的执行结果是2,2而不是0,1,因为等for循环出来后,执行setTimeout中的函数时,i的值已经变成了2,这就是没有隔离作用域所造成的,请看下面代码
for(var i=0; i<2; i++){
(function(i){
setTimeout(function(){
console.log(i);
},0);
})(i);
}
这样就会输出0,1,创建的立即执行函数创建了一个作用域,隔离了外界的作用域。
缺点是闭包需要访问外部函数的变量,外部变量不能释放,闭包嵌套太多,会导致内存占用大
关于this对象
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());//"The Window"(在非严格模式下
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());//"The Window"(
结合下面的例子用闭包的方式来理解这个that就可以很好的理解了
var name = "The Window";
var object = {
name : "My Object",
getName : function(){
return this.name;
}
};
object.getName();//"My Object"
(object.getName)();//"My Object"
(object.getName = object.getName)();//"The Window" 在非严格模式下
第三行代码先执行了一条赋值语句,然后再调用赋值后的结果。因为这个赋值表达式的值是函数本身,所以 this 的值不能得到维持,结果就返回了 “The Window” 。