当前位置: 首页 > news >正文

后盾人JS--闭包明明白白

延伸函数环境生命周期

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>function hd(){let n = 1return function sum(){let m =1return function show(){console.log(++m)}}}let a = hd()()a()a()</script>
</body>
</html>


构造函数中的作用域的使用形态

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>function Hd(){let n = 1this.sum = function(){console.log(++n)}}let a = new Hd()a.sum()a.sum()a.sum()</script>
</body>
</html>

模拟出var的伪块作用域

var没有块级作用域,但是有函数作用域

这样可以顺利打印出i:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>for(var i=1;i<=3;i++){(function(i){setTimeout(function(){console.log(i)},1000)})(i)}</script>
</body>
</html>

闭包获取价格区间

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>let arr = [1,23,4,5,6,7,8,9]function between(a,b){return function(v){return v>=a && v<=b}}console.log(arr.filter(between(3,9)))</script>
</body>
</html>

闭包动画

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<style>button {position: absolute}
</style><body><button message="后盾人">houdunren</button><script>let btns = document.querySelectorAll("button")btns.forEach(function (item) {item.addEventListener("click", function () {let left = 1setInterval(function () {item.style.left = left++ + "px"}, 5)})})</script>
</body></html>

 只要这样就可以防抖(直接是父级环境):

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<style>button {position: absolute}
</style><body><button message="后盾人">houdunren</button><script>let btns = document.querySelectorAll("button")btns.forEach(function (item) {let left = 1item.addEventListener("click", function () {setInterval(function () {item.style.left = left++ + "px"}, 5)})})</script>
</body></html>

 但是虽然不抖了,引来了加速的效果。。。

加一个判断条件,就只会执行一次了:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<style>button {position: absolute}
</style><body><button message="后盾人">houdunren</button><script>let btns = document.querySelectorAll("button")btns.forEach(function (item) {let left = 1let interval = falseitem.addEventListener("click", function () {if(!interval){interval = truesetInterval(function () {item.style.left = left++ + "px"}, 5)}})})</script>
</body></html>

 闭包排序

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>let lessons = [{title:"媒体查询响应式布局",click:89,price:12},{title:"FLEX弹性盒模型",click:45,price:120},{title:"GRID栅格系统",click:19,price:67},{title:"盒子模型详解",click:29,price:52}]function order(field){return function(a,b){return a[field] > b[field] ? 1 : -1}}let hd = lessons.sort(order("price"))console.table(hd)</script>
</body>
</html>

垃圾回收机制

 当闭包不再使用时,手动解除对闭包函数和相关变量的引用,让垃圾回收机制能够回收这些内存。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div desc="houdunren">在线学习</div><div desc="hdcms">开源产品</div><script>let divs = document.querySelectorAll('div')divs.forEach(function(item){item.addEventListener("click",function(){console.log(item)})item = null})</script>
</body>
</html>

 this遗留问题

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>let hd = {user:"后盾人",get: function(){let This = thisreturn function(){return This.user}}}let a = hd.get()console.log(a())</script>
</body>
</html>

也可以使用箭头函数:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><script>let hd = {user:"后盾人",get: function(){let This = thisreturn ()=>{return this.user}}}let a = hd.get()console.log(a())</script>
</body>
</html>

http://www.lryc.cn/news/529152.html

相关文章:

  • redis的分片集群模式
  • Kiwi 安卓浏览器本月停止维护,扩展功能迁移至 Edge Canary
  • 我的AI工具箱Tauri+Django内容生产介绍和使用
  • 四.4 Redis 五大数据类型/结构的详细说明/详细使用( zset 有序集合数据类型详解和使用)
  • Java---猜数字游戏
  • 网站快速收录:利用RSS订阅提升效率
  • vue3第三部分--组件通信
  • DeepSeek R1-Zero vs. R1:强化学习推理的技术突破与应用前景
  • matlab提取滚动轴承故障特征
  • 数据结构与算法学习笔记----容斥原理
  • Java 知识速记:全面解析 final 关键字
  • (笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识
  • 9、Docker环境安装Nginx
  • 受击反馈HitReact、死亡效果Death Dissolve、Floating伤害值Text(末尾附 客户端RPC )
  • 572. 另一棵树的子树
  • MATLAB中textBoundary函数用法
  • vue3的路由配置
  • 在彼此的根系里呼吸
  • 深入理解若依RuoYi-Vue数据字典设计与实现
  • 深入MapReduce——从MRv1到Yarn
  • Flutter_学习记录_Tab的简单Demo~真的很简单
  • CSS核心
  • Deepseek本地部署(ollama+open-webui)
  • PaddleSeg 从配置文件和模型 URL 自动化运行预测任务
  • 数据结构 队列
  • Cocoa和Cocoa Touch是什么语言写成的?什么是Cocoa?编程语言中什么是框架?为什么苹果公司Cocoa类库有不少NS前缀?Swift编程语言?
  • 登录管理——认证方案(JWT、拦截器、ThreadLocal、短信验证)
  • Java实现LFU缓存策略实战
  • 物业系统改革引领行业智能化管理与提升服务质量的新征程
  • QT+mysql+python 效果: