zoukankan      html  css  js  c++  java
  • js -- 写个闭包

    'use strict';

    function lazy_sum(arr) { var sum = function () { return arr.reduce(function (x, y) { return x + y; }); } return sum; }
    var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
    f(); // 15

    在这个例子中,我们在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。



    闭包的特性

      当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数:

      var f1 = lazy_sum([1, 2, 3, 4, 5]);
      var f2 = lazy_sum([1, 2, 3, 4, 5]);
      f1 === f2; // false
    

      f1()f2()的调用结果互不影响。

    没有class机制,只有函数,借助闭包,封装一个私有变量:
    'use strict';
    
    function create_counter(initial) {
        var x = initial || 0;
        return {
            inc: function () {
                x += 1;
                return x;
            }
        }
    }

    调用:
    var c1 = create_counter();
    c1.inc(); // 1
    c1.inc(); // 2
    c1.inc(); // 3
    
    var c2 = create_counter(10);
    c2.inc(); // 11
    c2.inc(); // 12
    c2.inc(); // 13

    就是这么神奇;



    很久很久以前,有个叫阿隆佐·邱奇的帅哥,发现只需要用函数,就可以用计算机实现运算,而不需要0123这些数字和+-*/这些符号。

    JavaScript支持函数,所以试试用JavaScript用函数来写这些计算。

    // 定义加法:
    function add(n, m) {
        return function (f) {
            return function (x) {
                return m(f)(n(f)(x));
            }
        }
    }

    // 计算数字2 = 1 + 1:
      var two = add(one, one);

    // 计算数字3 = 1 + 2:
      var three = add(one, two);

    // 计算数字5 = 2 + 3:
      var five = add(two, three);

    // 给3传一个函数,会打印3次:
      (three(function () {
        console.log('print 3 times');
      }))();

    // 给5传一个函数,会打印5次:
      (five(function () {
        console.log('print 5 times');
      }))();

    是不是很有意思   哈哈哈哈   代码真的很神奇呀 ;哈哈哈  

    源码来源 https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143449934543461c9d5dfeeb848f5b72bd012e1113d15000

    感谢廖大神;这么神奇的用法 好玩儿呀 ;
  • 相关阅读:
    [ASP.NET][实例]用户控件的设计与使用
    构造器[java、C#]
    [转]clob和blob两个字段什么分别?
    C#的反射机制调用方法
    C# WinForm 控件美化之改变ListView Head 的背景色
    C# 创建快捷方式
    Copy Html To Clipboard
    改善C#程序的建议在线程同步中使用信号量
    Paste html from Clipboard
    Winform部署mshtml程序集出错的一个解决方案
  • 原文地址:https://www.cnblogs.com/lipuqing180906/p/10001101.html
Copyright © 2011-2022 走看看