什么是闭包以及闭包的特点

闭包的主要作用是里面的变量和参数不会被垃圾回收机制回收

函数的定义过程与执行过程

1.开辟一个存储空间来装代码块

2.预编译

3.将存储空间和预编译的空结合变成一个执行空间

4.找到这个执行空间进行执行

5.销毁这个执行空间 存储空间也会被销毁

如果里面返回的数据类型 为引用数据类型就存储空间不会被销毁(对象的存储空间和函数存储空间不在一个地方 保持引用关系)

闭包主要使用的以返回函数作为保持引号关系而不让回收机制回收的特点

闭包的满足条件

1.内部函数必须调用外部函数的变量或者参数

2.必须以返回函数作为对应的一种返回形式

闭包的特点

function fn(a){//参数a 这个参数a是不会被销毁的(坏处:内存占用)return function(){//访问到这个aconsole.log(a);}
}
console.log( fn('hello'));//调用外部函数 (好处:内部的变量不会被外部污染)
1.内部的函数可以访问外部的内容
2.外部不能访问内部函数的变量

2.1 优点 保证内部函数变量的私有性(不会被外部内容污染)

2.2 缺点 一直要保持对这个变量的引用(效率低)

3.里面的变量和参数不会被垃圾回收机制回收

3.1 优点 可以作为缓存

3.2 缺点 占用内存

闭包的应用案例

防抖

在一定时间范围内进入执行的函数 会被忽略掉只剩一个(避免函数重复调用)

// 防抖  避免函数的重复调用  只执行一次
// 电梯  隔10秒一个人 再隔10秒一个人  .... 电梯关门为20秒 乘坐的都是一个电梯
// 应用场景 表单输入验证 等我有段时间没输入内容他就会验证
// setTimeoutfunction antishake(func,wait){//传入参数 为执行的方法 间隔的时间let timer = null //声明延时器对象为空return function(){clearTimeout(timer) //清除延时器timer = setTimeout(()=>{//延时器调用func()},wait)//区间内进来的只有一次执行}
}
let antishake1 = antishake(function(){console.log('hello');
},1000)
document.querySelector('div').onmouseenter = function(){antishake1()
}

节流

减少对应的函数执行次数 (连续多次的执行)

// 节流
//减少重复调用
//高铁站出租车只有一俩 如果有人在亮红灯 不能坐(让他走) 没有人绿灯(自己上去做)
//节流阀来控制节流
function throttle(fn,wait){//执行的函数 等待的时间let timer = null //节流阀return function(){if(timer) return //null false 不是null结果就是true 如果上车了没有直接跳过 没有人我就上去timer = setTimeout(()=>{ //上车了fn()timer = null//做完以后节流阀设置null 人下车了},wait)}
}
let throttle1 = throttle(function(){console.log("我上车了");
},2000)
document.querySelector('div').onclick = function(){throttle1()
}

区别

// 节流和防抖的区别
防抖避免重复执行  只执行一次
节流 减少执行次数 执行多次

函数柯里化(拆)

将传入的函数拆分为多个偏函数 避免重复的传参 以及 节省参数传递的过程 提高了效率

//函数柯里化 其实就是函数颗粒化 将一个函数变成一个个颗粒可以组装
// 就是这个里面的多个参数 将他变成一个个的函数来传递这个参数
function fnSum(a,b,c){//求和函数return a+b+c
}
//简单柯里化 他就是使用了一个函数来改造原本的函数
function curry(fn){return function(a){return function(b){return function(c){return fn(a,b,c)}}}
}
//调用 避免了多余的无用参数传递
let fnCurry = curry(fnSum) //函数
console.log(fnCurry(1)(2)(3));//6
//改进柯里化函数
function curry1(fn){//接收一个后面的参数 除了fn的参数 arguments第一个函数传递let args = Array.prototype.slice.call(arguments,1) //arguments调用slice(1)return function(){ //arguments 第二个函数传递let newArg = args.concat(Array.from(arguments)) //将内部函数的参数和外部的参数合并return fn.apply(this,newArg) // 传入所有的参数 将fn自动执行}
}
let fn2 = curry1(fnSum,1) //函数
console.log(fn2(2,3)); //6
// console.log(fn2(2)(3)); //错误 我们现在只套了俩层//改进柯里化函数
function curry2(fn){//接收一个后面的参数 除了fn的参数let args = Array.prototype.slice.call(arguments,1)return function(){let newArg = args.concat(Array.from(arguments)) //将内部函数的参数和外部的参数合并if(newArg.length < fn.length){ //参数没有到三个 fn.length获取传递的函数的参数个数return curry2.call(this,fn,...newArg) //又套了一个function}else{return fn.apply(this,newArg) //将内部函数自动指向 传入所有的参数} }
}
let fn3 = curry2(fnSum) //函数
console.log( fn3(1,2,3));
console.log( fn3()()(1,2));//少一个参数 返回funtion 效率更高  可读性高
console.log( fn3());//少一个参数 返回funtion 效率更高  可读性高
console.log( fn3()()(1));//少一个参数 返回funtion 效率更高  可读性高let fn4 = fn3(1)(2)
console.log(fn4(10)); // 1 + 2 + 10
console.log(fn4(15)); // 1 + 2 + 15

this

1.普通函数里面的this指向当前的调用者

2.箭头函数没有this 指向外面的对象

3.构造函数的this指向 当前的对象实例

利用关键词来更改this指向(更改function里面的this)

function fn(name){ //函数this.name = nameconsole.log(this);
}
fn('李四') //this指向window
function Student(){this.name = 'hello'this.age = 18
}
let student = new Student()
//bind 里面传递的是对应指向的对象
fn.bind(student)('李四')
//call 里面传递的是指向的对象和参数
fn.call(student,'王五') //name参数王五 自动调用方法
//apply 里面传递时指向的对象及参数数组
fn.apply(student,['赵六']) //传递一个参数数组 自动调用方法
bind 绑定this指向的对象(参数为绑定的对象)
call 自动调用方法 参数1为绑定的对象 参数2为传递参数 …
apply 自动调用方法 参数1为绑定的对象 参数2为参数数组

什么是闭包以及闭包的特点相关推荐

  1. Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  2. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  3. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  4. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...

    全面理解Javascript闭包和闭包的几种写法及用途 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一 ...

  5. 【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

    文章目录 一.闭包中调用 Groovy 脚本中的方法 二.owner 与 delegate 区别 三.闭包中调用 Groovy 对象中的方法 一.闭包中调用 Groovy 脚本中的方法 在 Groov ...

  6. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )

    文章目录 总结 一.闭包类 Closure 简介 二.闭包类 Closure 中 this.owner.delegate 成员 源码分析 三.分析编译后的字节码文件内容 总结 在闭包中 , 打印 th ...

  7. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )

    文章目录 一.闭包类 Closure 简介 二. 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 三. 完整代码示例 一.闭包类 Closure ...

  8. 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

    文章目录 一.闭包参数绑定 1.闭包参数绑定 curry 函数 2.闭包参数绑定 rcurry 函数 3.闭包参数绑定 ncurry 函数 二.完整代码示例 一.闭包参数绑定 闭包 Closure 提 ...

  9. 【Groovy】闭包 Closure ( 闭包参数列表规则 | 默认参数列表 | 不接收参数 | 接收自定义参数 )

    文章目录 一.闭包参数列表 二.闭包参数列表代码示例 一.闭包参数列表 闭包的参数设置有如下情况 : 不接收参数 : 如果在定义闭包时 , 只写了 " -> " 符号 , 没 ...

  10. 【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )

    文章目录 一.自定义闭包参数列表 1.定义一个自定义参数的闭包 2.定义多个自定义参数的闭包 3.为闭包参数指定默认值 二.完整代码示例 一.自定义闭包参数列表 如果要向 闭包 中 , 传递多个参数 ...

最新文章

  1. 列数较多的csv文件导入mysql数据库(过程及问题记录)
  2. Verilog功能模块——降采样
  3. C++Primer模板
  4. dataset转换json格式
  5. ANTLR教程– Hello Word
  6. [渝粤教育] 中国传媒大学 政治传播学 参考 资料
  7. Virtools自己编译播放器
  8. 比较两个字符串相同的个数,并输出
  9. php表示昨天_php 获取今日、昨日、上周、本月的起始与结束时间戳
  10. SqlServer2008卸载掉
  11. C语言规范标准-C99(中文版) 完整版正式发布
  12. 简单题我重拳出击,困难题我唯唯诺诺
  13. 索引原理-索引数据结构
  14. 【Python】窗口界面 按钮 文本框
  15. java.io.IOException: 设备未就绪
  16. 支付宝支付,当面付二维码支付
  17. php自动登录QQ空间,QQ空间自动登录 - brivio的个人页面 - OSCHINA - 中文开源技术交流社区...
  18. GPT分区系统硬盘对拷后系统无法启动
  19. 关于几个图像质量评价参数的计算总结
  20. 【精品】轻松部署ceph分布式存储集群

热门文章

  1. linux中常见渗透命令
  2. 像希望别人怎样对你那样对待别人
  3. 用matlab画钥匙,Matlab在锁具装箱问题中的应用.ppt
  4. EntityFramework 报错 调用的目标发生了异常 可能的原因之一
  5. 端到端OCR算法:Real-time Arbitrarily-Shaped Text Spottingwith Point Gathering Network(PGNet)
  6. 1到10的阶乘 java,1到10的阶乘和是多少 1的阶乘加到十的阶乘等于多少方法
  7. vivox3android系统,全球最薄5.75mm怎样炼成? vivo X3拆解
  8. 将Excel导入SAP数据库表
  9. web前端全栈0基础到精通(祺)07
  10. 潭州课堂25班:Ph201805201 mongo数据 库 第八课 (课堂笔记)