继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

总结一些函数闭包的练习题

_辣子
关注TA
已关注
手记 11
粉丝 9
获赞 119

今天闲着也没什么事情就又看了几个闭包函数的练习题,什么是闭包呢,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
例1:

function f() {
    var num = 1;
    function g() {
        console.log(num);
    }
    num++;
    g();   //2
}

这是一个简单的闭包函数,输出为2
例2:

(function() {
    var m = 0;
    function getM() {
        return m;
    }
    function seta(val) {
        m = val;
    }
    window.g = getM; 
    window.f = seta;
})();
f(100);
console.info(g());    //100

首先在匿名函数内部定义了一个局部m变量,然后调用全部函数f(100)把m的值赋为100,然后调用g()函数,返回100.
例3:

function a() {
    var i = 0;
    function b() {
        alert(++i);
    }
    return b;
}
var c = a();
c(); //1
c(); //2 

上面在函数a内部定义了一个局部变量i的值是1,声明一个变量c并把a函数的返回值赋给c,a函数的返回值是b函数,所以c算是b函数的引用吧;第一次调用c函数,执行alert(++i);先自加后弹框,也就是1;在第二次调用弹出的是2,这是为什么呢,这是因为函数在使用完毕后i变量还在栈内存中并没有销毁,所以在第二次调用自加前I的值是1,和第一次调用的顺序一样,先自加后弹框,弹出2
注意:
因为闭包函数使用完毕后变量i还在内存中没有销毁,再次调用自加弹出的是2,所以闭包函数在使用后如果不再使用一定要记得销毁变量,否则会拉低页面的性能,在ie中会造成内存泄漏
例4:

function f() {
    var count = 0;
    return function() {
        conut++;
        console.info(count);
    }
}
var t1 = f();
t1(); //1
t1(); //2
t1(); //3 

这个例子和例3大致上一样,只不过这个函数的内部函数是以返回值的形式,而上个函数的内部函数是直接定义函数然后再返回内部函数
例5:

var add = function(x) {
    var sum = 1;
    var tmp = function(x) {
        sum = sum + x;
        return tmp;
    }
    tmp.toString = function() {
        return sum;
    }
    return tmp;
    }
alert(add(1)(2)(3))    // 6

这个调用的比较复杂一点,不过也是很好理解的,add(1)(2)(3),第一次调用传入了参数1,没有使用,此时sum的值是1;然后返回tmp函数,第二次调用tmp函数传入 2,sum的值是1+2=3;第三次重复调用tmp函数传入3,sum的值是3+3=6;隐式自动调用tmp的toString()弹出6,add()()()这种调用形式返回值和第一个括号内传的参数无关,第一个括号内传的参数并没有使用,只和第二三个括号传的参数有关

打开App,阅读手记
9人推荐
发表评论
随时随地看视频慕课网APP

热门评论

你这个例子5有问题吧

查看全部评论