JS递归、闭包、this

来源:互联网 发布:淘宝淘口令在哪里设置 编辑:程序博客网 时间:2024/05/20 10:52

一、递归

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” 。

0 0
原创粉丝点击