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 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
Dec 16 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
Dec 20 Javascript
javascript二维数组转置实例
Jan 22 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
May 30 Javascript
javascript使用btoa和atob来进行Base64转码和解码
Mar 20 Javascript
兼容浏览器的js事件绑定函数(详解)
May 09 Javascript
Jquery中attr与prop的区别详解
May 27 jQuery
vue实现简单的星级评分组件源码
Nov 16 Javascript
vue组件通信传值操作示例
Jan 08 Javascript
JS数组去重详情
Nov 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
zend api扩展的php对象的autoload工具
2011/04/18 PHP
php中{}大括号是什么意思
2013/12/01 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
2016/05/23 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
Python fileinput模块使用实例
2015/06/03 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
Python tempfile模块生成临时文件和临时目录
2020/09/30 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
注塑工厂厂长岗位职责
2013/12/02 职场文书
更夫岗位责任制
2014/02/11 职场文书
迎新晚会主持词
2014/03/24 职场文书
战略合作意向书范本
2014/04/01 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript