zoukankan      html  css  js  c++  java
  • js的一些点

    1 闭包

    闭包就是说,能够读取其他函数内部变量的函数。

    其实这句话我不是很明白,因为我觉得闭包的作用是:

    1. 延迟函数执行
    2. 模拟私有变量

    根据第二点的描述,应该是阻止其他东西访问自身私有成员,到了这怎么变成读取其他函数内部变量了?反其道而行之?

    不管定义了,看看最经典的这个例子

    (延迟执行):

    function count() {
        var arr = [];
        for (var i=1; i<=3; i++) {
            arr.push(function () {
                return i * i;
            });
        }
        return arr;
    }
    
    var results = count();
    var f1 = results[0];
    var f2 = results[1];
    var f3 = results[2];

    在函数内一个数组arr,用于保存平方的匿名函数。在匿名函数里,用到了前面的局部变量i,这里注意,这个匿名函数从始至终都没有执行过,然而又用到了i,因此说i被捕获了,不能释放。

    接下来f1 ~ f3被赋值了三个匿名函数。分别用来计算1、2、3的平方。

    f1(); // 16
    f2(); // 16
    f3(); // 16

    然后依次执行f1 ~ f3。结果居然都是16,而不是1、4、9。可以这么理解,匿名函数要用到i,因此i被捕获了,不能释放,真正到执行的时候,才用到了i,这时候的i已经是4了。因此结果是16。

    因此,可以让他不要只是捕获,而是捕获顺便就执行一下。

    function count() {
        var arr = [];
        for (var i = 1; i <= 3; i++) {
            arr.push(
                (function (n) {
                    return function () {
                        return n * n;
                    }
                })(i)
            );
        }
        return arr;
    }

    这里利用了直接执行(function () {}) ();

    (私有变量)

     1 function createCounter(initial) {
     2     var x = initial || 0;
     3     return {
     4         add: function () {
     5             return ++ x;
     6         }
     7     }
     8 }
     9 
    10 var counter1 = createCounter();
    11 var counter2 = createCounter(10);
    12 counter1.add();
    13 counter1.add();
    14 counter2.add();
    15 counter2.add();
    16 console.log(counter1.add()); // 3
    17 console.log(counter2.add()); // 13

    其中,变量x被隐藏了,外界无法访问。

  • 相关阅读:
    UWP 应用获取各类系统、用户信息 (1)
    Windows Composition API 指南
    详解 UWP (通用 Windows 平台) 中的两种 HttpClient API
    Win2D 官方文章系列翻译
    Spring的IOC容器, AOP切面及启动流程简述
    maven和gradle的全局阿里云镜像代理
    SpringBoot项目中@Async方法没有执行的问题分析
    Oracle向MySQL迁移的注意点整理
    SpringBoot项目替换内部的依赖jar包
    MySQL的主从复制
  • 原文地址:https://www.cnblogs.com/liwenchi/p/10662695.html
Copyright © 2011-2022 走看看