js 立即执行函数与闭包

立即执行函数

针对初始化功能的函数
此类函数没有声明,执行完之后立即被销毁
定义一个只执行一个的函数,这个函数会一直存在内存空间中,很占用内存,所以对于只执行一次的函数,把它定义为立即执行函数更合理(某些情况除外)
只有表达式才能被执行

(function(a,b,c){
    console.log(a + b + c*2);
}(1,2,3))
//立即执行函数可以有返回值
let num = (function(a,b,c){
    let d = a + b + c;
    return d;
}(1,2,3))

闭包

当内部函数被保存到外部时,将会生成闭包,闭包会导致原有作用域链不释放,造成内存泄漏

  1. 实现公有变量(函数累加器)
    function add(){
        var num = 0;
        function a(){
            console.log(++num);
        }
        return a;

    }
    var  myAdd = add();
    myAdd();
    myAdd();
  1. 可以做缓存 (存储结构)
function eater(){
    let food ="";
    let obj = {
        eat : function (){
            console.log("i am eating" + food);
            foot = "";
        },
        push : function(myfood){
            food = myfood;
        }
    }
    return obj;
}

let eater1 = eater();

eater1.push('ok');
eater1.eat();
  1. 可以实现封装

继承

  1. 模块化开发,反之污染全局变量

命名空间

容易犯的错误

    function text(){
            var arr = [];
            for(var i = 0;i<10;i++){
                arr[i] = function(){
                    console.log(i);
                }
                
            }
            return arr;
        }   
        var aaa = text();
        for(var j = 0;j<10 ;j++){
                // mss[j]();
                aaa[j]();
        }
  1. 此题返回的10个10 而不是0123456789

因为在arr数组被保存到了外部,但是在它执行之前i 已经变成10 了

     function text(){
            var arr = [];
            for(var i = 0;i<10;i++){
                (function(a){
                    arr[a] =function(){
                        console.log(a);
                    } 
                }(i))
                
            }
            return arr;
        }   
        var aaa = text();
        for(var j = 0;j<10 ;j++){
                // mss[j]();
                aaa[j]();
        }
  1. 还是这题,如果想要返回的结果是你想要的,可以通过立即执行函数来解决闭包问题

原文地址:https://www.qianqianhaiou.cn/index.php/archives/73/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值