美文网首页
箭头函数

箭头函数

作者: xiaoT_P | 来源:发表于2019-08-08 10:08 被阅读0次

原文地址: https://geromekevin.com/understanding-arrow-functions/
本文版权归原作者所有,翻译仅用于学习。


在这篇教程中你将会学习:“Javascript 中的箭头函数是什么?” 和 “箭头函数和正常的函数有什么不同?”

相比正常的函数箭头函数有以下 4 点不同:

  1. 有特有的语法
  2. 没有函数式声明,只有表达式
  3. 没有自己的 this
  4. 有一个隐式的 return

1. 不同的语法

这里有箭头函数和正常关键字 function 语法的对比。两个函数我都用了 IIFE

(function() {
  console.log('function keyword');
})();

(() => {
  console.log('arrow function');
})();

注意:如果箭头函数只有一个参数,没有任何花哨的参数,你可以省略参数周围的括号。

// You need brackets
const noArguments = () => {};
// You can ommit the brackets.
const oneArgument = n => {
  return n * 2;
};
// You need brackets
const defaultParameter = (name = 'Anon') => {
  return name;
};
// You need brackets.
const destructuringOneArgment = ({ name }) => {
  return name;
};
// You need brackets.
const moreThanOneArgument = (a, b) => {
  return a + b;
};

2. 只有表达式

你也可以通过在关键字 funciton 后面添加变量给函数命名。这叫"函数式声明"。对于箭头函数不能这么做,只能用匿名函数表达式。

// function declaration with keyword
function decleration() {
  console.log('function declaration with keyword');
}

// function expression with keyword
const keywordExpression = function() {
  console.log('function expression with keyword');
};

// function declaration with arrow function
// 🔴 Not a thing.

// function expression with arrow function
const arrowExpression = () => {
  console.log('function expression with keyword');
};

函数式声明和表达式声明两者的不同之处是解析时间不同。函数式声明可以在任何地方定义,然而,表达式声明只能在定义之后才能访问。

declaration(); // ✅ Okay

function decleration() {}

foo(); // 🔴 TypeError: foo is not a function
var foo = () => {};
// We could've also written var foo = function() {}
bar(); // 🔴 ReferenceError: Cannot access 'bar' before initialization
const bar = () => {};

从这你也可以看到 constvar 之间的不同。由于,foo 是由关键字 var 声明的,所以,它会出现变量提升,并且它的初始值是 undefinedfoo() 在尝试调用 undefined,显然它不是一个函数。由于,const 没有变量提升,执行 bar 会抛出一个引用错误。

3. 没有 this

就像其它语言一样,Javascript 也有 this 关键字。有几种绑定 this 的方法:显式或者隐式。我们只关注箭头函数相关的内容即可。

const car = {
  wheels: 'four',
  yellWheels() {
    return this.wheels.toUpperCase();
  },
  countWheels: () => {
    return this.wheels;
  },
};

car.yellWheels(); // 'FOUR'
car.countWheels(); // undefined

使用 function 关键字,this 引用的是当前对象。然而,箭头函数则没有自己的 this。因此,wheels 是 undefined,这是因为 global 对象没有属性 wheels

想要更好的理解 this,可以查看 Eric Elliott’s “This 是什么?”

4. 隐式的 return

在上一段代码中,我们用 return 关键字从函数中返回了一个值。不过,箭头函数不需要这样做。如果,你的函数中只有一句表达式,你可以省略掉大括号,表达式会自动的返回。

// These two functions do the same
const explicitReturn = () => {
  return 'foo';
};
const implicitReturn = () => 'foo';

explicitReturn(); // 'foo'
implicitReturn(); // 'foo'

用隐式 return ,我们可以简化示例中的语法。

// Can't be simplified, no expression
const noop = () => {};

// Can be simplified, return expressions
const getName = (name = 'Anon') => name;
const double = n => n * 2;
const getNameProp = ({ name }) => name;
const add = (a, b) => a + b;

隐式的 return柯里化变得非常简单,也就是一个函数返回另外一个函数,最终返回一个值。

const add = a => b => a + b; // add is a function that returns b => a + b
// Read this as const add = a => (b => a + b);
const inc = add(1); // inc is a function because b => a + b got returned
const decr = add(-1);

inc(3); // 4 because inc remembers a as 1
inc(6); // 7
decr(3); // 2 because decr remembers a as -1

add 是一个函数,它有一个参数 a,然后,返回一个参数为 b 的函数,最终返回 ab 的和。参数为 b 函数会在闭包中记住 a

如果,你喜欢这篇文章,你或许也会喜欢“理解 React 中的条件渲染”,因为,文章中我们会深入的探讨 ||&&

总结

我们已经明白了关键字 function 和箭头函数之间的 4 种不同之处。

相关文章

  • ES6~箭头函数

    什么是箭头函数 单表达式箭头函数 相当于 多表达式箭头函数 箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有...

  • 箭头函数和立即执行函数

    箭头函数 箭头函数和普通函数有什么区别?如果把箭头函数转换为不用箭头函数的形式,如何转换主要是this的差别,箭头...

  • 学习 ES 6 箭头函数

    箭头函数的用法 ES6 允许使用“箭头”(=>)定义函数。 箭头函数的一个用处是简化回调函数。 箭头函数 this...

  • 箭头函数

    箭头函数 箭头函数能让this的指向固定化 分析:1)第一个setInterval()中使用了箭头函数,箭头函数使...

  • TS  笔记this

    this 箭头函数在箭头函数创建的地方获得this;非箭头函数,在调用函数的地方获得this如图

  • 箭头函数和数组

    箭头函数&数组 箭头函数 特点: 没有 this 没有 arguments 没有prototype在箭头函数中使用...

  • 箭头函数

    箭头函数 为什么使用箭头函数

  • 箭头函数中this的指向

    箭头函数在平时开发中用着非常爽,箭头函数有什么特点呢 箭头函数不能够当做构造函数使用 箭头函数没有argument...

  • js学习笔记4(函数)

    1.箭头函数 ES6新增属性。箭头函数特别适合嵌入函数的场景。 箭头函数虽然语法简介,但是很多场合不适用。箭头函数...

  • js理解普通函数和箭头函数

    普通函数: 箭头函数: 区别: 构造函数和原型 箭头函数不能作为构造函数 不能new。会报错 箭头函数没有原型属性...

网友评论

      本文标题:箭头函数

      本文链接:https://www.haomeiwen.com/subject/ooytjctx.html