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()); // 16
function 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已經變了。可以創建一個匿名函數解決 或者使用let
function 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( );
}
});
});
}