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

延伸函数环境生命周期

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 = 1
            return function sum(){
                let m =1
                return function show(){
                console.log(++m)
                }
            }
        }
        let a = hd()()
        a()
        a()
    </script>
</body>
</html>

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

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 = 1
            this.sum = function(){
                console.log(++n)
            }
        }
        let a = new Hd()
        a.sum()
        a.sum()
        a.sum()
    </script>
</body>
</html>

模拟出var的伪块作用域

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

这样可以顺利打印出i:

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>
        for(var i=1;i<=3;i++)
    {
        (function(i){
            setTimeout(function(){
                console.log(i)
            },1000)
        })(i)
    }
    </script>
</body>
</html>

闭包获取价格区间

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>

闭包动画

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 = 1
                setInterval(function () {
                    item.style.left = left++ + "px"
                }, 5)
            })
        })
    </script>
</body>

</html>

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

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 = 1
            item.addEventListener("click", function () {
                setInterval(function () {
                    item.style.left = left++ + "px"
                }, 5)
            })
        })
    </script>
</body>

</html>

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

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

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 = 1
            let interval = false
            item.addEventListener("click", function () {
                if(!interval)
            {
                interval = true
                setInterval(function () {
                    item.style.left = left++ + "px"
                }, 5)
            }
            })
        })
    </script>
</body>

</html>

闭包排序

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>

垃圾回收机制

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

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遗留问题

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 = this
                return function(){
                    return This.user
                }
            }
        }
        let a = hd.get()
        console.log(a())
    </script>
</body>
</html>

也可以使用箭头函数:

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 = this
                return ()=>{
                    return this.user
                }
            }
        }
        let a = hd.get()
        console.log(a())
    </script>
</body>
</html>
相关推荐
码农小韩4 分钟前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
木风小助理5 分钟前
`mapfile`命令详解:Bash中高效的文本至数组转换工具
开发语言·chrome·bash
yyy(十一月限定版)14 分钟前
初始matlab
开发语言·matlab
LawrenceLan15 分钟前
Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
开发语言·flutter·dart
listhi52015 分钟前
基于MATLAB的支持向量机(SVM)医学图像分割方法
开发语言·matlab
hui函数20 分钟前
如何解决 pip install 编译报错 g++: command not found(缺少 C++ 编译器)问题
开发语言·c++·pip
Tisfy29 分钟前
网站访问耗时优化 - 从数十秒到几百毫秒的“零成本”优化过程
服务器·开发语言·性能优化·php·网站·建站
济61736 分钟前
嵌入式C语言(第一期)
c语言·开发语言
XiaoHu020737 分钟前
Linux多线程(详细全解)
linux·运维·服务器·开发语言·c++·git
苏宸啊1 小时前
C++(二)类和对象上篇
开发语言·c++