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]);
console.log(f); // function sum()
console.log(f()); // 15
let sumAdd=f()+f();
console.log(sumAdd); // 30// 在lazy_sum定义了sum,内部的sum又应用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时
// 相关参数和变量都保持在返回的函数中 叫闭包
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];console.log(f1()); // 16
console.log(f2()); // 16
console.log(f3()); // 16function count2(){var arr=[];for(var i=1;i<=3;i++){arr.push((function(n){return function(){return n*n;}})(i));}return arr;
}
var results2=count2();
var f3=results2[1];
console.log(f3()); // 4
// 闭包并非立即执行所以尽量不要循环 而等三个函数返回时i已经变了。可以创建一个匿名函数解决 或者使用letfunction create_counter(initial){var x=initial || 0;return {inc:function(){x+=1;return x;}}
}
var c1=create_counter();
console.log(c1.inc()); 1
// js没有class机制 借助闭包可以封装一个私有变量 闭包就是一个携带状态的函数
async present() { // 表示异步调用this.isLoading = true;return await this.loadingController.create({ 等待返回message: '疯狂加载中...',duration: 2000,}).then(a => {a.present().then(() => {if (!this.isLoading) {a.dismiss().then( );}});});}