JavaScript学习笔记(高阶函数二)

不念不忘少年蓝@ 2023-02-11 03:23 62阅读 0赞

JavaScript学习笔记(高阶函数二)

      • 箭头函数
      • generator

箭头函数

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。
例如:

  1. function(x){
  2. return x * x;
  3. }

用箭头函数来表示:

  1. x => x * x

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式

  1. x => {
  2. if (x > 0) {
  3. return x * x;
  4. }
  5. else {
  6. return - x * x;
  7. }
  8. }

如果参数不是一个,就需要用括号()括起来:

  1. //两个参数
  2. (x,y) => x * x + y * y
  3. //无参
  4. (s) => 3.14
  5. //可变参
  6. (x,y,...rest) => {
  7. var i,sum = x+ y;
  8. for(i = 0;i<rest.length;i++){
  9. sum += rest[i];
  10. }
  11. return sum;
  12. }

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

  1. //SyntaxError:
  2. x => { foo:x}

因为和函数体的{ … }有语法冲突,所以要改为:

  1. //正常
  2. x = > ({ foo:x)

this
箭头函数 看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下方文确定。

  1. var boj = {
  2. birth:1990,
  3. getAge:function (){
  4. var b = this.birth;//1990
  5. var fn = function () {
  6. return new Date.getFullYear() - this.birth;//
  7. };
  8. // var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
  9. return fn();
  10. }
  11. };
  12. console.log(boj.getAge());

会报错误:
在这里插入图片描述
修改为:

  1. var boj = {
  2. birth:1990,
  3. getAge:function (){
  4. var b = this.birth;//1990
  5. var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
  6. return fn();
  7. }
  8. };
  9. console.log(boj.getAge());

在这里插入图片描述
如果使用了箭头函数 ,以前的那种hack写法:
var that = this;
就不需要 了。

generator

generator(生成器)是ES6标准引入的新的数据类型,一个generator看上去像一个函数,可以返回多次。
函数的定义

  1. functoin foo(x){
  2. return x + x;
  3. }
  4. var r = foo(1);//调用foo函数

函数在执行过程中,如果没有遇到return语句(函数末尾如果没有return ,就量隐含的return undefined;),控制权无法交回被调用的代码。

  1. function* foo(x){
  2. yield x + 1;
  3. yield x + 2;
  4. return x + 3;
  5. }

generator和函数不同的是,generator由function* 定义(注意多出的*),并且,除了return 语句,还可以用yield返回多次。
我们以一个著名的斐波那契数列为例,它由0,1开头:

  1. 0 1 1 2 3 5 8 13 21 34 ...
  2. function* flb(max) {
  3. var
  4. t,
  5. a = 0,
  6. b = 1,
  7. n = 0;
  8. while(n < max){
  9. yield a;
  10. [a,b] = [b,a + b];
  11. n ++;
  12. }
  13. return ;
  14. }
  15. // fib(5)仅仅是创建了一个generator对象,还没有去执行它。
  16. console.log(flb(5));
  17. //第一种方式:不断地调用generator对象的next()方法
  18. var f = flb(5);
  19. f.next(); // {value: 0, done: false}
  20. f.next(); // {value: 1, done: false}
  21. f.next(); // {value: 1, done: false}
  22. f.next(); // {value: 2, done: false}
  23. f.next(); // {value: 3, done: false}
  24. f.next(); // {value: undefined, done: true}
  25. //第二种方式:使用for..of遍历
  26. for (const x of flb(10)) {
  27. console.log(x);
  28. }

next()方法会执行generator的代码,然后,每次遇到yield x;就返回一个对象{value:x,done:true/false},然后”暂停“。返回的value就是yiled的返回值,done表示这个generator是否已经执行结束了,如果done为true,则value就是return 的返回值。
因为generator可以在执行过程中多次返回,所以它看上去就像现代战争可以记住执行状态的函数,利用这一点,写一个generator就可以实现需要面向对象才能实现的功能。例如,用一个对象来保存状态,得这么写:

  1. var fib = {
  2. a:0,
  3. b:1,
  4. n:0,
  5. max:5,
  6. next:function () {
  7. var
  8. r = this.a,
  9. t = this.a + this.b;
  10. this.a = this.b;
  11. this.b = t;
  12. if(this.n < this.max){
  13. this.n ++;
  14. return r;
  15. }else{
  16. return undefined;
  17. }
  18. }
  19. }

generator还有另一个巨大的好处,就是把异步回调代码变成“同步”代码。这个好处要等到后面学了AJAX以后才能体会到。
没有generator之前的黑暗时代,用AJAX时需要这么写代码:

  1. ajax('http://url-1', data1, function (err, result) {
  2. if (err) {
  3. return handle(err);
  4. }
  5. ajax('http://url-2', data2, function (err, result) {
  6. if (err) {
  7. return handle(err);
  8. }
  9. ajax('http://url-3', data3, function (err, result) {
  10. if (err) {
  11. return handle(err);
  12. }
  13. return success(result);
  14. });
  15. });
  16. });

用generator来写

  1. try {
  2. r1 = yield ajax('http://url-1', data1);
  3. r2 = yield ajax('http://url-2', data2);
  4. r3 = yield ajax('http://url-3', data3);
  5. success(r3);
  6. }
  7. catch (err) {
  8. handle(err);
  9. }

发表评论

表情:
评论列表 (有 0 条评论,62人围观)

还没有评论,来说两句吧...

相关阅读

    相关 JavaScript 函数

    JavaScript 中的高阶函数是指可以接受函数作为参数或返回函数作为返回值的函数。它可以帮助我们实现抽象、灵活地处理函数,是函数式编程的重要工具。 常见的 JavaScr

    相关 JavaScript函数笔记

    今天和一位老师学习了高阶函数,感觉非常有用,做个笔记。 我学习的JavaScript三个高阶函数是filter/map/reduce,高阶函数真的很不错,我打个比方吧,如果说

    相关 函数

    上周我已经给大家推送了一篇关于高阶函数的文章,这一期,我们继续探讨一些相关的有意思的话题。 1 复合函数 大家一定见过下面的数学题吧: ![0?wx\_fmt=png