• 关于闭包的理解


    闭包官方定义:闭包是指程序中有许多变量和绑定变量的执行环境。

    本人自己理解:程序的代码段允许存在一级函数并且一级函数不能被释放,一级函数没有释放之前,外部可以使用一级函数的局部变量。

    进一步理解 : 闭包就是外部可以使用局部变量。

    闭包的功能:1、外部可以使用局部变量。
          2、使函数不能释放。
    闭包的缺点:外部会修改局部变量,会大量占用内存,内存不会被释放。

    为什么一级函数不能被释放?
    答:因为一级函数中有一个函数,这个函数使用了一级函数的变量,我们返回了这个函数并创建一个变量接收了。那么这个函数就不会被js的垃圾回收机制销毁。

    最常用的一种形式是函数作为返回值被返回

    var F = function(){
        var b = 'local';
        var N = function(){
            return b;
        }
        return N;
    }
    console.log(F()());

    一种变形的形式是将内部函数赋值给一个外部变量

    var inner;
    var F = function(){
        var b = 'local';
        var N = function(){
            return b;
        };
        inner = N;
    };
    F();
    console.log(inner());

    闭包可以通过函数参数传递函数的形式来实现

    var Inner = function(fn){
        console.log(fn());
    }
    var F = function(){
        var b = 'local';
        var N = function(){
            return b;
        }
        Inner(N);
    }
    F();

    我们通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部

    var getValue,setValue;
    (function(){
        var secret = 0;
        getValue = function(){
            return secret;
        }
        setValue = function(v){
            if(typeof v === 'number'){
                secret = v;
            }
        }
    })();
    console.log(getValue());//0
    setValue(1);
    console.log(getValue());//1

    使用闭包可以很方便的实现一个迭代器

    function setup(x){
        var i = 0;
        return function(){
            return x[i++];
        }
    }
    var next = setup(['a','b','c']);
    console.log(next());//'a'
    console.log(next());//'b'
    console.log(next());//'c'

    谢谢大家

  • 相关阅读:
    mysql存储过程笔记
    mysql 命令行操作
    第一天前来报到
    Android Studio导入工程版本问题、gradle版本问题
    LogUtils-定制自己的日志工具
    Git2.11安装下载和github使用
    Android Studio 2.3版本 以及相应的gradle3.3包
    android 导入第三方jar包和类库
    GifView——Android显示GIF动画
    Android中dip、dp、sp、pt和px的区别详解
  • 原文地址:https://www.cnblogs.com/u-lhy/p/7077837.html
Copyright © 2020-2023  润新知