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

感谢廖大神;这么神奇的用法 好玩儿呀 ;
原文地址:https://www.cnblogs.com/lipuqing180906/p/10001101.html