闭包(21)

闭包及堆栈内存释放

 

 /*
 * JS中的内存分为堆内存和栈内存
 *   堆内存:存储引用数据类型值(对象:键值对  函数:代码字符串)
 *   栈内存:提供JS代码执行的环境和存储基本类型值
 *
 * [堆内存释放]
 *   让所有引用堆内存空间地址的变量赋值为null即可(没有变量占用这个堆内存了,浏览器会在空闲的时候把它释放掉)
 *
 * [栈内存释放]
 *   一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉(在栈内存中存储的值也都会释放掉),但是也有特殊不销毁的情况:
 *   1.函数执行完成,当前形成的栈内存中,某些内容被栈内存以外的变量占用了,此时栈内存不能释放(一旦释放外面找不到原有的内容了)
 *   2.全局栈内存只有在页面关闭的时候才会被释放掉
 *   ...
 *   如果当前栈内存没有被释放,那么之前在栈内存中存储的基本值也不会被释放,能够一直保存下来
 */

var i = 1;
function fn(i) {
    return function (n) {
        console.log(n + (++i));
    }
}
var f = fn(2);
f(3);
fn(5)(6);
fn(7)(8);
f(4);

//var f=fn (2);//=>先把FN执行(传递实参2),把FN执行的返回结果(RETURN后面的值)赋值给F
//f();//=>把返回的结果执行
//fn(2)() ;//=>和上面两步骤类似,都是先把FN执行,把FN执行的返回结果再次执行

//=>在和其它值进行运算的时候有一些区别
// i++:自身累加1 (先拿原有值进行运算,运算结束后,本身累加1)
// ++i:自身累加1 (先自身累加1,拿累加后的结果进行运算)
/*
var k = 1;
console.log(5 + (k++), k);//=>6 2
k = 1;
console.log(5 + (++k), k);//=>7 2
*/
//=>思考题:
var k = 1;
console.log(5 + (++k) + (k++) + 4 + (k--) + (++k) + 3 + (--k) + (k++), k);//=>26 3

闭包作用之保护

 [闭包]

  =>函数执形成一个私有的作用域,保护里面的私有变量不受外界的干扰,这种保护机制称之为“闭包”

  =>市面上的开发者认为的闭包是:形成一个

不销毁的私有作用域(私有栈内存)才是闭包

//=>闭包:柯理化函数
/*
function fn() {
    return function () {

    }
}
var f = fn();
*/

/*
//=>闭包:惰性函数
var utils = (function () {
    return {

    }
})();
*/

 闭包项目实战应用

真实项目中为了保证JS的性能(堆栈内存的性能优化),应该尽可能的减少闭包的使用(不销毁的堆栈内存是耗性能的)

1.闭包具有“保护”作用:保护私有变量不受外界的干扰

   > 在真实项目中,尤其是团队协作开发的时候,应当尽可能的减少全局变量的使用,以防止相互之前的冲突(“全局变量污染”),那么此时我们完全可以把自己这一部分内容封装到一个闭包中,让全局变量转换为私有变量

/*
(function () {
    var n = 12;
    function fn() {

    }

    //...
})();
*/

//> 不仅如此,我们封装类库插件的时候,也会把自己的程序都存放到闭包中保护起来,防止和用户的程序冲突,但是我们又需要暴露一些方法给客户使用,这样我们如何处理呢?
//1.JQ这种方式:把需要暴露的方法抛到全局
/*
(function () {
    function jQuery() {
        //...
    }

    //...
    window.jQuery = window.$ = jQuery;//=>把需要供外面使用的方法,通过给WIN设置属性的方式暴露出去
})();
// jQuery();
// $();
*/

//2.Zepto这种方式:基于RETURN把需要共外面使用的方法暴露出去
/*
var Zepto=(function () {
    //...
    return {
        xxx:function () {

        }
    };
})();
Zepto.xxx();
*/

2.闭包具有“保存”作用:形成不销毁的栈内存,把一些值保存下来,方便后面的调取使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值