js闭包的9个使用场景


Posted in Javascript onDecember 29, 2020

1.返回值(最常用)

//1.返回值 最常用的
    function fn(){
        var name="hello";
        return function(){
            return name;
        }
    }
    var fnc = fn();
    console.log(fnc())//hello

这个很好理解就是以闭包的形式将 name 返回。

2.函数赋值

var fn2;
function fn(){
    var name="hello";
    //将函数赋值给fn2
    fn2 = function(){
        return name;
    }
}
fn()//要先执行进行赋值,
console.log(fn2())//执行输出fn2

在闭包里面给fn2函数设置值,闭包的形式把name属性记忆下来,执行会输出 hello。

3.函数参数

function fn(){
    var name="hello";
    return function callback(){
        return name;
    }
}
var fn1 = fn()//执行函数将返回值(callback函数)赋值给fn1,
 
function fn2(f){
    //将函数作为参数传入
    console.log(f());//执行函数,并输出
}
fn2(fn1)//执行输出fn2

用闭包返回一个函数,把此函数作为另一个函数的参数,在另一个函数里面执行这个函数,最终输出 hello

4.IIFE(自执行函数)

(function(){
        var name="hello";
        var fn1= function(){
            return name;
        }
        //直接在自执行函数里面调用fn2,将fn1作为参数传入
        fn2(fn1);
    })()
    function fn2(f){
        //将函数作为参数传入
        console.log(f());//执行函数,并输出
    }

直接在自执行函数里面将封装的函数fn1传给fn2,作为参数调用同样可以获得结果 hello

5.循环赋值

//每秒执行1次,分别输出1-10
for(var i=1;i<=10;i++){
    (function(j){
        //j来接收
        setTimeout(function(){
            console.log(j);
        },j*1000);
    })(i)//i作为实参传入
}

如果不采用闭包的话,会有不一样的情况,可以看我自己 闭包 的文章。

6.getter和setter

function fn(){
        var name='hello'
        setName=function(n){
            name = n;
        }
        getName=function(){
            return name;
        }
         
        //将setName,getName作为对象的属性返回
        return {
            setName:setName,
            getName:getName
        }
    }
    var fn1 = fn();//返回对象,属性setName和getName是两个函数
    console.log(fn1.getName());//getter
        fn1.setName('world');//setter修改闭包里面的name
    console.log(fn1.getName());//getter

第一次输出 hello 用setter以后再输出 world ,这样做可以封装成公共方法,防止不想暴露的属性和函数暴露在外部。

7.迭代器(执行一次函数往下取一个值)

var arr =['aa','bb','cc'];
function incre(arr){
    var i=0;
    return function(){
        //这个函数每次被执行都返回数组arr中 i下标对应的元素
         return arr[i++] || '数组值已经遍历完';
    }
}
var next = incre(arr);
console.log(next());//aa
console.log(next());//bb
console.log(next());//cc
console.log(next());//数组值已经遍历完

8.首次区分(相同的参数,函数不会重复执行)

var fn = (function(){
               var arr=[];//用来缓存的数组
                   return function(val){
                       if(arr.indexOf(val)==-1){//缓存中没有则表示需要执行
                           arr.push(val);//将参数push到缓存数组中
                           console.log('函数被执行了',arr);
                           //这里写想要执行的函数
                       }else{
                           console.log('此次函数不需要执行');
                       }
                       console.log('函数调用完打印一下,方便查看已缓存的数组:',arr);
                   }
               })();
        
       fn(10);
       fn(10);
       fn(1000);
       fn(200);
       fn(1000);

执行结果如下:

js闭包的9个使用场景

可以明显的看到首次执行的会被存起来,再次执行直接取。

9.缓存

//比如求和操作,如果没有缓存,每次调用都要重复计算,采用缓存已经执行过的去查找,查找到了就直接返回,不需要重新计算
      
     var fn=(function(){
        var cache={};//缓存对象
        var calc=function(arr){//计算函数
            var sum=0;
            //求和
            for(var i=0;i<arr.length;i++){
                sum+=arr[i];
            }
            return sum;
        }
         
        return function(){
            var args = Array.prototype.slice.call(arguments,0);//arguments转换成数组
            var key=args.join(",");//将args用逗号连接成字符串
            var result , tSum = cache[key];
            if(tSum){//如果缓存有   
                console.log('从缓存中取:',cache)//打印方便查看
                result = tSum;
            }else{
                //重新计算,并存入缓存同时赋值给result
                result = cache[key]=calc(args);
                console.log('存入缓存:',cache)//打印方便查看
            }
            return result;
        }
     })();
    fn(1,2,3,4,5);
    fn(1,2,3,4,5);
    fn(1,2,3,4,5,6);
    fn(1,2,3,4,5,8);
    fn(1,2,3,4,5,6);

输出结果:

js闭包的9个使用场景

以上就是js闭包的9个使用场景的详细内容,更多关于js 闭包使用场景的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
非常不错的功能强大代码简单的管理菜单美化版
Jul 09 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
Jquery实现三层遍历删除功能代码
Apr 23 Javascript
JS鼠标滑过图片时切换图片实现思路
Sep 12 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
Feb 28 Javascript
HTML5实现留言和回复页面样式
Jul 22 Javascript
AngularJS初始化静态模板详解
Jan 14 Javascript
JS中的数组方法笔记整理
Jul 26 Javascript
Vuex实现数据增加和删除功能
Nov 11 Javascript
vue+element导航栏高亮显示的解决方式
Nov 12 Javascript
Vue双向绑定实现原理与方法详解
May 07 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 #Javascript
vue3+typeScript穿梭框的实现示例
Dec 29 #Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 #Vue.js
vue实现简易的双向数据绑定
Dec 29 #Vue.js
elementui实现预览图片组件二次封装
Dec 29 #Javascript
利用node.js开发cli的完整步骤
Dec 29 #Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
Dec 29 #Javascript
You might like
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
2012/05/06 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
php常用的url处理函数总结
2014/11/19 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
JavaScript window.location对象
2014/11/14 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
解决Django连接db遇到的问题
2019/08/29 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
大学三年的自我评价
2013/12/25 职场文书
新学期家长寄语
2014/01/19 职场文书
三好学生事迹材料
2014/12/24 职场文书
警告通知
2015/04/25 职场文书
小平小道观后感
2015/06/09 职场文书
2019同学聚会主持词
2019/05/06 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
Python装饰器详细介绍
2022/03/25 Python
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers