闭包有点难,待后续深入学习
闭包:函数 + 创建函数的词法环绕的组合
函数除了可以接受函数作为参数,还可以将函数作为结果值返回。返回的是函数,而不是结果。
可以类比于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 }
value 为每次返回的值,done属性标识是否是最后一次输出
- 使用
for .. io
循环遍历
var g = foo(5);
for(var value of g) {
console.log(value);
}
// OUTPUT
5
6
7