JS(十)闭包、立即执行函数

写在最前面

正文开始

//例子

function a() {
    function b(){
        var bbb = 234;
        console.log(aaa)
    }
    var aaa = 123;
    return b;
}

var glob = 100;
var demo = a();
demo();

首先这个函数在执行return b之后,函数就a执行完了,会销毁a的AO,但是在销毁之前函数b被保存出来了,所以b的执行期上下文并没有被销毁。

所以b的AO、Go都被保存出来了

这样就形成了闭包,也可以这样说:内部函数被保存到了外部,一定形成闭包

function a (){
    var num  = 100;
    function b(){
        num ++;
        console.log(num);
    }
    return b;
}

var demo = a();
demo();//打印101
demo();//打印102

闭包的概念 : 当内部函数保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存占用)

内存泄露 : 举个例子…一个杯子…你往里面到的水越多,他的内存越少(同理,你内存占的越多,他的内存越少)

闭包的作用
  • 实现公有变量

    • 函数累加器
  • 可以做缓存(存储结构)

    • eater
  • 可以实现封装,属性私有化

    • Person()
  • 模块化开发,防止污染全局变量

1、累加器上述例子已经写了

2、可以做缓存(存储结构)

function test(){
    var num = 100;
    function a(){
        num ++;
        console.log(num);
    };
    function b(){
        num --;
        console.log(num);
    };
    return [a,b]
}

var myArr = test();

myArr[0]();//打印101
myArr[1]();//打印100
function eater(){
    var food = "";
    var obj ={
        eat : function(){
            console.log("i am eating" + food)
        },
        push : function (myFood){
            food = myFood;
        }
    }
    return obj;
}

var eater1 = eater();

eater1.push('banana');
eater1.eat();
//打印出 i am eating banana

上面的这个例子我在eater1.push(‘banana’)之后就给了eater里面的foot = “”,变成了food = “banana”。我在执行eater1.eat()之后就变成了拿到food = “banana” ,他们操作的都是同一个闭包,所以打印出i am eating banana,这个foot就相当于一个隐式的存储结构一样,这个就是缓存的应用

给自己买个坑,属性私有化,在我写完对象之后在解释,模块化开发也一样

立即执行函数

此类函数没有声明,在一次执行后即释放。适合做初始化工作。

function a(){
    
}

function b(){
    
}

我定义两个函数,这两个函数除非等到我JavaScript执行完,否则这两个函数永远都不的释放,永远等待被执行,等待被执行就占空间。

作用 : 针对初始化功能的函数

(function (aaa,bbb,ccc){
    var a = 234;
    var b = 123;
    var c = a+b;
    console.log(c)
    return c
}(1,2,3))

执行完立即被销毁

// 怎么去接收他
var num = (function (aaa,bbb,ccc){
    var a = 234;
    var b = 123;
    var c = a+b;
    console.log(c)
    return c
}(1,2,3))

立即执行函数有两种写法

//第一种
(function(){}());//w3c 建议第一种
//第二种
(function(){})();

扩展

只有表达式才可以被执行符号执行

var test = function (){}()
//也可以被执行

+ function test(){}()
//也可以被执行 以此类推- !号也可以

function test(){
    console.log(a+b+c+d)
}(1,2,3,4)
//不执行也不报错

可以关注一下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值