ECMAScript6-函数的扩展

系列文章目录

上一期我们学习了数值扩展的相关内容,这一期我们讲解函数的扩展相关知识。



函数的扩展

  • 函数参数的默认值
  • 箭头函数
  • 箭头函数中this的理解
  • 箭头函数使⽤注意点

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

1、函数参数的默认值

  • ES6之前,不能直接为函数的参数指定默认值,只能采⽤变通的⽅法。
  • ES6允许为函数的参数设置默认值,即直接写在参数定义的后⾯。
  • 参数默认值的位置:
    1 通常情况下,定义了默认值的参数,应该是函数的尾参数。
    2因为这样⽐较容易看出来,到底省略了哪些参数。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(name) {
      console.log(name);
    }
    f("xiaoqiao");//xiaoqiao
  </script>
</body>
</html>

当我们的函数的参数在传参的时候赋值了,则会按照传进来的参数进行

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(name) {
      console.log(name);
    }
    f();//undefined
  </script>
</body>
</html>

如果函数的参数未传,会默认赋值为undefined

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(name) {
        name=name||"lisi";
      console.log(name);//lisi
    }
    f();//undefined
  </script>
</body>
</html>

在我们对函数进行传参的时候,我们可以对函数的参数进行默认值的设置,当我们未对函数的参数设置的时候,我们的参数就会使用我们设置的初始值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(name="lisi") {
      console.log(name);//lisi
    }
    f();//undefined
  </script>
</body>
</html>

这是我们的另一种写法,我们还可以在参数列表的时候就对参数进行赋值,作用和上面的那种一样。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(x,y) {
      console.log(x+y);
    }
    f(10,20);//30
  </script>
</body>
</html>

当我们的函数有多个参数的时候,我们赋值的时候就需要注意了,当我们参数的默认值都设置的时候

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(x,y) {
        x=x||10;
        y=y||20;
      console.log(x+y);
    }
    f();//30
    f(10,20);//30
    f(10);//30
  </script>
</body>
</html>

当我们没对所有的参数进行默认值设置的时候,我们的参数设置时,就是从前面往后面进行设置,所以当我们的参数没有设置的时候

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(x=10,y) {
      console.log(x+y);
    }
    f(10,20);//30
    f(10);//NaN
    f();//NaN
  </script>
</body>
</html>

2、箭头函数

  • ES6允许使⽤“箭头”(=>)定义函数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(x) {
      return x;
    }
    console.log(f(100));//100

    var x=(x)=> {
        return x;
    }
    console.log(x(100));//100

    var x1=x=> {
        return x;
    }
    console.log(x1(100));//100
    var x2=x=>x
    console.log(x2(100));//100
  </script>
</body>
</html>

当我们对函数定义时,我们可以使用箭头函数来更方便的去定义函数,当函数的参数只有一个的时候小括号可以省略,当我们的函数体只有一行语句时花括号也能省略。

如果箭头函数不需要参数或需要多个参数,就使⽤⼀个圆括号代表参数部分。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f() {
      return 100;
    }
    console.log(f(100))//100
    
    var x=()=>100;
    console.log(x());
    
  </script>
</body>
</html>

当我们定义的函数没参数的时候,可以这样定义

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    function f(x,y) {
      return x+y;
    }
    console.log(f(100,200))//300

    var x=(x,y)=>x+y;
    console.log(x(100,200));//300

  </script>
</body>
</html>

当我们函数的参数有多个时,例如上述的代码所示

  • 如果箭头函数的代码块部分多于⼀条语句,就要使⽤⼤括号将它们括起来,并且使⽤return语句返 回。
  • 也就是说默认函数体没有⼤括号是⾃带隐式返回renturn的。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    var x=(x,y)=> {
        let sum=x+y;
        return sum;
    };
    console.log(x(100,200));//300

  </script>
</body>
</html>
  • 由于⼤括号被解释为代码块,所以如果箭头函数直接返回⼀个对象,必须在对象外⾯加上括号,否 则会报错。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
    var x=(x,y)=> {
        let sum=x+y;
        let person={x:x,y:y,sum:sum};
        return person;
    };
    console.log(x(100,200));//300

    let getTempItem = id => ({ id: id, name:"Temp" });
    console.log(getTempItem(15))

  </script>
</body>
</html>

3、箭头函数中this的理解

传统javaScript代码中this的使⽤

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
      //定义⼀个stu学⽣对象,内有:两个属性、⼀个⽅法。
      const stu = {
          name:"张三",
          likes:['吃饭','睡觉','敲代码'],
          printLikes:function(){
              //使⽤map遍历likes属性,并输出信息
              this.likes.map(function(like){
                  //此处的this代表的是window对象,⽽⾮stu对象
                  console.log(`${this.name} 喜欢 ${like}`);
              });
          }
      };
      stu.printLikes(); //使⽤stu对象调⽤⾃⼰的⽅法
      /* 输出结果:
       喜欢 吃饭
       喜欢 睡觉
       喜欢 敲代码
      */

  </script>
</body>
</html>

上⾯的输出this.name没有信息,如下进⾏修改就可以了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
      //定义⼀个stu学⽣对象,内有:两个属性、⼀个⽅法。
      const stu = {
          name:"张三",
          likes:['吃饭','睡觉','敲代码'],
          printLikes:function(){
              let self = this;
              //使⽤map遍历likes属性,并输出信息
              this.likes.map(function(like){
                  //此处的this代表的是window对象,⽽⾮stu对象
                  console.log(`${self.name} 喜欢 ${like}`);
              });
          }
      };
      stu.printLikes(); //使⽤stu对象调⽤⾃⼰的⽅法
      /* 输出结果:
       张三 喜欢 吃饭
       张三 喜欢 睡觉
       张三 喜欢 敲代码
      */

  </script>
</body>
</html>

使⽤箭头函数后的效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
      //定义⼀个stu学⽣对象,内有:两个属性、⼀个⽅法。
      const stu = {
          name:"张三",
          likes:['吃饭','睡觉','敲代码'],
          printLikes:function(){
              //使⽤map遍历likes属性,并输出信息
              this.likes.map(like => {
                  //箭头函数中没有⾃⼰的this,故此处this是继承⽗作⽤域的。
                  //⽽且是在定义的时候已指定,不会随着调⽤⽽改变。
                  console.log(`${this.name} 喜欢 ${like}`);
              });
          }
      };
      stu.printLikes(); //使⽤stu对象调⽤⾃⼰的⽅法
      /* 输出结果:
       张三 喜欢 吃饭
       张三 喜欢 睡觉
       张三 喜欢 敲代码
      */

  </script>
</body>
</html>

4、箭头函数使⽤注意点

  • 函数体内的this对象,就是定义时所在的对象,⽽不是使⽤时所在的对象。
  • 不可以当作构造函数,也就是说,不可以使⽤new命令,否则会抛出⼀个错误。
  • 当你真的需要this的时候,如为对象添加普通⽅法或事件绑定回调函数使⽤箭头函数,可能获取不
    到this。
    不可以使⽤arguments对象,该对象在函数体内不存在。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
      //1.箭头函数不可以作为构造函数使⽤
      const Stu1 = (name,age)=>{
          this.name = name;
          this.age = age;
      }
      //要改成常规函数如下:
      const Stu2 = function(name,age){
          this.name = name;
          this.age = age;
      }
      //实例化
      //s = new Stu1("zhangsan",20);//报错:TypeError: Stu is not a constructor
      s = new Stu2("zhangsan",20); //正常
      console.log(s); //Stu2 {name: "zhangsan", age: 20}
      //定义Stu类
      const Stu = function(name,age){
          this.name = name;
          this.age = age;
      }
      s = new Stu("zhangsan",20); //正常实例化
      //为s原型对象添加⼀个getInfo⽅法,使⽤箭头函数,⾥⾯的this是window对象
      Stu.prototype.getInfo = ()=>{
          return `我叫${this.name},今年${this.age}岁`;
      }
      //改成常规函数
      Stu.prototype.getInfo2 = function(){
          return `我叫${this.name},今年${this.age}岁`;
      }
      console.log(s.getInfo()); //我叫,今年undefined岁
      console.log(s.getInfo2()); //我叫zhangsan,今年20岁

  </script>
</body>
</html>

上⾯四点中,第⼀点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。


总结

本期我们讲解了函数的扩展的相关内容,下一期我们讲解数组的扩展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值