'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(); // 1c1.inc(); // 2c1.inc(); // 3var c2 = create_counter(10); c2.inc(); // 11 c2.inc(); // 12 c2.inc(); // 13 就是这么神奇; 很久很久以前,有个叫阿隆佐·邱奇的帅哥,发现只需要用函数,就可以用计算机实现运算,而不需要0、1、2、3这些数字和+、-、*、/这些符号。 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 感谢廖大神;这么神奇的用法 好玩儿呀 ;