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

    感谢廖大神;这么神奇的用法 好玩儿呀 ;
  • 相关阅读:
    hdu 1174
    计算几何模板
    又是一年博客记
    hdu 1225 Football Score
    与逆序数有关的
    hdu 2844 Coins
    hdu 1171 Big Event in HDU
    UVA Exponentiation
    UVA Summation of Four Primes
    Linux:设置alias永久生效
  • 原文地址:https://www.cnblogs.com/lipuqing180906/p/10001101.html
Copyright © 2011-2022 走看看