欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6的箭头函数(Arrow Function)

程序员文章站 2023-12-21 13:10:58
...

概述

ES6标准新增了一种新的函数:Arrow Function(箭头函数).
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target。这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不能用作构造函数。
引入箭头函数有两个方面的作用:更简短的函数并且不绑定this。

基本语法

  1. (参数1, 参数2, …, 参数N) => { 函数声明 }
    相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
  2. (参数1, 参数2, …, 参数N) => 表达式(单一)
  3. 当只有一个参数时,圆括号是可选的:
    (单一参数) => {函数声明}
    单一参数 => {函数声明}
  4. 没有参数的函数应该写成一对圆括号。
    () => {函数声明}

示例讲解

var elements = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];

elements.map(function(element) { 
  return element.length; 
}); // 返回数组:[8, 6, 7, 9]

// 上面的普通函数可以改写成如下的箭头函数
elements.map((element) => {
  return element.length;
}); // [8, 6, 7, 9]

// 当箭头函数只有一个参数时,可以省略参数的圆括号
elements.map(element => {
 return element.length;
}); // [8, 6, 7, 9]

// 当箭头函数的函数体只有一个 `return` 语句时,可以省略 `return` 关键字和方法体的花括号
elements.map(element => element.length); // [8, 6, 7, 9]

// 在这个例子中,因为我们只需要 `length` 属性,所以可以使用参数解构
// 需要注意的是字符串 `"length"` 是我们想要获得的属性的名称,而 `lengthFooBArX` 则只是个变量名,
// 可以替换成任意合法的变量名
elements.map(({ "length": lengthFooBArX }) => lengthFooBArX); // [8, 6, 7, 9]
  • 只有一个参数的函数情况
//在ES6中,第一个a表示函数参数,箭头“=>”后面的 a 表示函数体。
const value = x => x;
//ES5写法
const value = function(x) {
  return x;
} 
  • 没有具体参数需要在箭头前加上小括号
const log = () => {
  console.log("Hello Arrow Function!!")
}
  • 需要传递多个参数,在小括号中用,隔开
let sum = (x, y) = > x + y;
  • 返回对象时需要用小括号包起来,因为大括号被占用解释为代码块了
handleClickSubmit => {
  //....
  return ({
    name: "zengsk",
    age: 23  
  })
}

注意点

  • 箭头函数不绑定this
    在箭头函数出现之前,每个新定义的函数都有它自己的 this值(在构造函数的情况下是一个新对象,在严格模式的函数调用中为 undefined,如果该函数被作为“对象方法”调用则为基础对象等)。This被证明是令人厌烦的面向对象风格的编程。
    示例
//ES6以前
function Person() {
  // Person() 构造函数定义 `this`作为它自己的实例.
  this.age = 0;
  setInterval(function growUp() {
    // 在非严格模式, growUp()函数定义 `this`作为全局对象, 
    // 与在 Person()构造函数中定义的 `this`并不相同.
    this.age++;
  }, 1000);
}
var p = new Person();
//ES6写法
//箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this。
//因此,在下面的代码中,
//传递给setInterval的函数内的this与封闭函数中的this值相同:
function Person(){
  this.age = 0;

  setInterval(() => {
    this.age++; // |this| 正确地指向 p 实例
  }, 1000);
}
var p = new Person();
  • 箭头函数不能和 new 操作符一起使用, 会抛错误
var Foo = () => {};
var foo = new Foo(); // TypeError: Foo is not a constructor
  • 箭头函数没有prototype属性
var Foo = () => {};
console.log(Foo.prototype); // undefined
  • 箭头函数可以使用三目运算符
var simple = a => a > 15 ? 15 : a;
simple(16); // 15
simple(10); // 10

let max = (a, b) => a > b ? a : b;

总结

更详细的介绍可参看js最新的参考文档https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions

上一篇:

下一篇: