閉包、箭頭函式、generator JavaScript邊學邊記(五)
阿新 • • 發佈:2018-12-20
閉包:函式 + 建立函式的詞法環繞的組合
函式除了可以接受函式作為引數,還可以將函式作為結果值返回。返回的是函式,而不是結果。 可以類比於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])
時,會返回一個函式。
- 內部函式可以引用外部函式的引數和變數
- var f = laz_num([1,2,3]); 此時返回求和函式而不是結果。呼叫
f()
時才回返回結果6
- 返回的函式互相獨立,互不影響。
- 返回的函式不立即執行,只有呼叫時才執行。
注意 返回的函式不要引用任何迴圈變數,或者後續會變化的變數。
用法
- 實現類的私有變數與私有方法
- 將多引數函式改變為單引數函式
一知半解,先簡單記記。
立即執行的函式寫法
(function (x) {
return x * x;
})(4);
箭頭函式
不論是用法還是含義,和Lambda表示式一樣
var result =
(x, y) => {
return x + y;
};
- 單個引數時,小括號可以省略。零個或多個引數時都不能省略
- 單個表達時,return和
{}
可省略 - 箭頭函式中
this
指向詞法作用域
generator ES6
可以返回多個值
function* foo(x) {
yield x++;
yield x++ ;
yield x++;
return x + 3;
}
- 使用
function*
標識,注意*
號 - 除使用return返回值外,還可以通過
yield
多次返回 - 呼叫方法
- 先呼叫方法,返回一個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);
for(var value of g) {
}
// OUTPUT
Object { value: 5, done: false }
Object { value: 6, done: false }
Object { value: 7, done: false }
Object { value: 11, done: true }