1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# ES6新增箭头函数(Arrow Function) // 下面2个定义是等效的 var fn = x => x * x; var fn = function (x) { return x * x; }; // 多个参数用()包裹 (x, y) => x + y; // 无参数 () => 2; // 可变参数 (a, b, ...rest) => { var i, sum = a + b; for(i=0;i<rest.length;i++) { sum += rest[i]; } return sum; }; // 返回对象用()包裹,否则{}会语义冲突 x => ({key:3}); // 箭头函数修复了this的指向,不需要用that来捕获this了 // 但是在箭头函数中使用apply和call,第一个参数无法对this进行绑定了(第一个参数会被忽略) var obj = { birth: 1990, getAge: function () { var fn = () => { return new Date().getFullYear() - this.birth; }; return fn(); } }; # ES6新增generator生成器 // 以斐波那契数列为例 0 1 1 2 3 5 8 13 21 ... // 普通的函数实现,只能一次性返回整个数组 function fib(max) { var t, a = 0, b = 1, arr = [0, 1]; while(arr.length < max) { t = a + b; a = b; b = t; arr.push(t); } return arr; } // 以generator实现 function* fib(max) { var t, a = 0, b = 1, i; for(i=0;i<max;i++) { yield a; t = a + b; a = b; b = t; } return a; } var gen = fib(5); // 可以分段返回 console.log(gen.next()); // Object {value: 0, done: false} console.log(gen.next()); // Object {value: 1, done: false} console.log(gen.next()); // Object {value: 1, done: false} console.log(gen.next()); // Object {value: 2, done: false} console.log(gen.next()); // Object {value: 3, done: false} console.log(gen.next()); // Object {value: 5, done: true} console.log(gen.next()); // Object {value: undefined, done: true} // 可以对其进行迭代 for(let i of fib(5)) { console.log(i); } // generator还有另一个巨大的好处,就是把异步回调代码变成“同步”代码 ajax('http://url-1', data1, function (err, result) { if (err) { return handle(err); } ajax('http://url-2', data2, function (err, result) { if (err) { return handle(err); } ajax('http://url-3', data3, function (err, result) { if (err) { return handle(err); } return success(result); }); }); }); // 这种写法和上面的效果是一样的 try { r1 = yield ajax('http://url-1', data1); r2 = yield ajax('http://url-2', data2); r3 = yield ajax('http://url-3', data3); success(r3); } catch (err) { handle(err); } // 利用generator模拟id自增分发器 function* next_id() { var id = 1; while(true) { yield id; id++; } } var gen = next_id(); alert(gen.next().value); alert(gen.next().value); |