1. 程式人生 > >閉包、箭頭函式、generator JavaScript邊學邊記(五)

閉包、箭頭函式、generator JavaScript邊學邊記(五)

閉包:函式 + 建立函式的詞法環繞的組合

函式除了可以接受函式作為引數,還可以將函式作為結果值返回。返回的是函式,而不是結果。 可以類比於Java中類,只有一個公共方法(閉包中返回的函式)的類類似於閉包。

function make_sum(arr) {
    var sum = function () {
        return arr.reduce(function (x, y) {
            return x + y;
        });
    }
   sum();
}

若呼叫make_sum([1,2,3])時會直接返回6

function lazy_sum
(arr) { var sum = function () { return arr.reduce(function (x, y) { return x + y; }); } return sum; }

呼叫lazy_sum([1,2,3])時,會返回一個函式。

  1. 內部函式可以引用外部函式的引數和變數
  2. var f = laz_num([1,2,3]); 此時返回求和函式而不是結果。呼叫f()時才回返回結果6
  3. 返回的函式互相獨立,互不影響。
  4. 返回的函式不立即執行,只有呼叫時才執行。

注意 返回的函式不要引用任何迴圈變數,或者後續會變化的變數。

用法

  1. 實現類的私有變數與私有方法
  2. 將多引數函式改變為單引數函式

一知半解,先簡單記記。

立即執行的函式寫法

(function (x) {
	return x * x;
})(4);

箭頭函式

不論是用法還是含義,和Lambda表示式一樣

var result = 
	(x, y) => {
		return x + y;
	};
  1. 單個引數時,小括號可以省略。零個或多個引數時都不能省略
  2. 單個表達時,return和{}可省略
  3. 箭頭函式中this指向詞法作用域

generator ES6可以返回多個值

function* foo(x) {
	yield x++;
	yield x++
; yield x++; return x + 3; }
  1. 使用function*標識,注意*
  2. 除使用return返回值外,還可以通過yield 多次返回
  3. 呼叫方法
  • 先呼叫方法,返回一個generator物件
  • 使用next()方法
var g = foo(5);
console.log(g.next());
console.log(g.next());
console.log(g.next());
console.log(g.next());

// OUTPUT

Object { value: 5, done: false }
Object { value: 6, done: false }
Object { value: 7, done: false }
Object { value: 11, done: true }
  • 使用 for .. io迴圈遍歷
var g = foo(5);
forvar value of g) {
}
// OUTPUT

Object { value: 5, done: false }
Object { value: 6, done: false }
Object { value: 7, done: false }
Object { value: 11, done: true }