闭包的小知识

闭包

把重要的数据包起来,不能直接修改,闭包让数据更安全
主要靠函数内部局部变量的作用域 特征实现 ,改变局部变量的值

闭包的特征

  1. 外函数嵌套里函数
  2. 外层函数创建局部变量
  3. 里层函数使用外层函数的变量
  4. 里层函数能够在其他地方触发(通过return里层函数

闭包的优劣

  1. 闭包的优势(价值):修改局部变量的值,使数据更安全
  2. 闭包的缺点:由于局部变量可修改,所以需要一直占用内存,不会被垃圾回收清理。过多的使用闭包会导致内存压力增加,页面变卡。

案例

这个案例是关于闭包的this的解析:

1.外层函数被对象object所调用,故外层函数的this为object
2.而内层函数是被return出去以后在全局的区域下被调用,
又没有引用上一层的this,故其this为window

<script>
    // /* 全局变量 name */
    // var name = "The Window";
    // /* 对象 object */
    // var object = {
    //     name: "My Object",
    //     getNameFunc: function () {
    //         // console.log(this);   // object
    //         return function () {
    //             console.log(this === window);     // true
    //             console.log(this);                // window
    //             return this.name;
    //         };
    //     }
    // };
    //
    // /* 调用了对象的方法 */
    // var res = object.getNameFunc();
    // var liFnRes = res();
    // console.log(liFnRes);                       // "The Window"


    var name = "The Window";
    var object = {
        name: "My Object",
        getNameFunc: function () {
            var that = this;            // 这一步  object
            return function () {
                return that.name;       // 用的是上一个作用域的局部变量
            };
        }
    };

    var res = object.getNameFunc();
    var LifnRes = res();
    console.log(LifnRes);       // "My Object"
</script>

这个案例是关于闭包的运用 (投票模块)

1.这里在js里面封装了一个闭包函数,其外层函数有一个变量为count(即投票的初始 值)
2. 里函数的作用是,每次调用时把count++,并把count放到按钮上面
3.给每个按钮注册点击事件,其事件的回调函数绑定为调用外层函数返回的结果(即带有一个外层变量count的里层函数)
4.每个按钮的点击事件所绑定的里层函数其实是不一样的(return的特点),故每一个count都是相互独立的,所以可以有点击只给自己加点击数的效果

<ul>
    <li><img alt="" src="img/liudehua.jpg"/><input type="button" value="投票(0)"/></li>
    <li><img alt="" src="img/zhourunfa.jpg"/><input type="button" value="投票(0)"/></li>
    <li><img alt="" src="img/liudehua.jpg"/><input type="button" value="投票(0)"/></li>
    <li><img alt="" src="img/zhourunfa.jpg"/><input type="button" value="投票(0)"/></li>
</ul>
</body>
</html>
<script>


    /* 闭包基本结构 */
    function wai() {
        var count = 0;
        /* 里层函数作为外层函数调用后的返回值 */
        return function () {
            count++;
            console.log(count);
            // console.log(this);
            /* 里函数赋值给了 按钮点击事件,所以 this 指向当前点击的按钮 */
            this.value = '投票(' + count + ')';
        }
    }

    /* 查找所有按钮元素 */
    var btns = document.querySelectorAll('input');
    /* for 循环给所有按钮添加点击事件 */
    for (var i = 0; i < btns.length; i++) {
        /* 把外层函数执行后的<返回值> 赋值给 点击事件 */
        btns[i].onclick = wai();
    }
</script>
Swift 中的闭包是一个自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。Swift 中的闭包类似于 C 和 Objective-C 中的 blocks、以及其他一些编程语言中的 lambdas。 闭包有以下三种形式: 1. 全局函数,有名字但不能捕获任何值。 2. 嵌套函数,有名字,也能捕获其封闭函数内的值。 3. 闭包表达式,没有名字,使用轻量级语法,可以捕获上下文中的值。 闭包表达式的基本语法如下: ``` { (parameters) -> return type in statements } ``` 其中 `parameters` 为参数列表,可以为空;`return type` 为返回类型,也可以为空;`statements` 为闭包体,包含了要执行的代码。 例如,下面的代码定义了一个接受两个整数参数并返回它们之和的闭包: ``` let sum = { (a: Int, b: Int) -> Int in return a + b } ``` 可以像函数一样调用这个闭包: ``` let result = sum(1, 2) print(result) // 输出 3 ``` 闭包可以作为函数的参数或返回值。例如,下面的代码定义了一个接受一个整型数组和一个闭包参数的函数 `apply`: ``` func apply(_ array: [Int], _ transform: (Int) -> Int) -> [Int] { var result = [Int]() for element in array { result.append(transform(element)) } return result } ``` 可以使用闭包表达式作为 `transform` 参数传递: ``` let numbers = [1, 2, 3, 4, 5] let squared = apply(numbers, { (number) -> Int in return number * number }) print(squared) // 输出 [1, 4, 9, 16, 25] ``` 闭包还支持尾随闭包语法,可以将闭包表达式作为函数的最后一个参数传递,并将其放在圆括号之外。例如,上面的代码也可以写成: ``` let squared = apply(numbers) { (number) -> Int in return number * number } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值