js 高級5 閉包 async 和 await

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( );
                }
              });
            });
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章