JavaScript箭头函数:如何,为什么,何时(何时不)使用它们

发布时间:2018-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了JavaScript箭头函数:如何,为什么,何时(何时不)使用它们脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
现代JavaScript中最引人注目的功能之一是使用新令牌引入箭头函数,有时称为“胖箭头”函数=>。 这些功能有两个主要优点 - 非常简洁的语法和更直观的范围和this绑定。 这些好处有时导致箭头功能比其他形式的功能声明更受欢迎。 例如,受欢迎的airbnb eslint配置会在您创建匿名函数时强制使用JavaScript箭头函数。 然而,就像工程中的任何东西一样,箭头函数带有正面和负面。他们的使用存在权衡。 学习这些权衡是很好地使用箭头函数的关键。 在本文中,我们将首先回顾箭头函数的工作原理,然后深入研究箭头函数改进代码的示例,最后深入研究箭头函数不是一个好主意的示例。

那么JavaScript箭头的功能究竟是什么

JavaScript箭头函数大致相当于python中lambda函数Ruby中的块。 这些是具有自己的特殊语法的匿名函数,它们接受固定数量的参数,并在其封闭范围上下文中操作- 即定义它们的函数或其他代码。 让我们依次分解这些部分。

箭头函数语法

箭头函数具有单一的总体结构,然后在特殊情况下可以通过多种方式简化它们。 核心结构如下所示:
(argument1, argument2, ... argumentN) => {
  // function body
}
括号内的参数列表,后跟“胖箭头”(=>),后跟函数体。 这与传统函数非常相似,我们只是省略function关键字并在参数后添加一个胖箭头。 然而,有许多方法可以“加油”,使箭头功能显着简化为简单的功能。 首先,如果函数体是单个表达式,则可以不使用括号并将其置于内联中。表达式的结果将由函数返回。例如:
const add = (a, b) => a + b;
其次,如果只有一个参数,你甚至可以在参数周围留下括号。例如:
const getFirst = array => array[0];
  正如您所看到的,这可以导致一些非常简洁的语法,我们将突出以后的更多好处。

高级语法

有一些高级语法可用于了解。 首先,如果您尝试使用内联单表达式语法,但您返回的值是对象文字。您可能会认为这看起来像:
(name, description) => {name: name, description: description};
问题是这种语法含糊不清 - 看起来好像你正试图创建一个传统的函数体。 要表明您想要一个碰巧是对象的单个表达式,请用括号包装该对象:
(name, description) => ({name: name, description: description});

附上范围上下文

与其他形式的函数不同,箭头函数没有自己的执行上下文。 实际上,这意味着,thisarguments继承从其父功能。 例如,使用和不使用箭头函数比较以下代码:
const test = {
  name: 'test object',
  createAnonFunction: function() {
    return function() {
      console.LOG(this.name);
      console.log(arguments);
    };
  },

  createArrowFunction: function() {
    return () => {
      console.log(this.name);
      console.log(arguments);
    };
  }
};
  我们有一个简单的测试对象,有两个方法 - 每个方法都有一个创建并返回匿名函数的函数。 不同之处在于它使用传统函数表达式的第一种情况,而在后者中它使用箭头函数。 如果我们在具有相同参数的控制台中运行它们,我们会得到非常不同的结果。
> const anon = test.createAnonFunction('hello', 'world');
> const arrow = test.createArrowFunction('hello', 'world');

> anon();
undefined
{}

> arrow();
test object
{ '0': 'hello', '1': 'world' }
匿名函数有自己的函数上下文,因此当您调用它时this.name,测试对象没有可用的引用,也没有创建它时调用的参数。 另一方面,箭头函数具有与创建它的函数完全相同的函数上下文,使其可以访问argumetns和测试对象。

箭头功能改进您的代码

传统lambda函数的主要用例之一,现在用于JavaScript中的箭头函数,是用于一遍又一遍地应用于列表中项目的函数。 例如,如果您想要使用地图转换值的数组,则箭头函数是理想的:
const words = ['hello', 'WORLD', 'Whatever'];
const downcasedWords = words.map(word => word.toLowerCase());
一个非常常见的例子是提取对象的特定值:
const names = objects.map(object => object.name);
类似地,当for使用现代迭代器样式循环替换旧式循环时foreach,箭头函数this与父级保持一致的事实使它们非常直观。
this.examples.forEach(example => {
  this.runExample(example);
});

承诺和承诺链

箭头函数的另一个地方是更清晰,更直观的代码管理异步代码。 Promise使得管理异步代码变得容易得多(即使你很高兴使用async / await,你仍然应该理解 async / awaIT建立在什么之上的承诺!) 但是,虽然使用promises仍然需要定义在异步代码或调用完成后运行的函数。 这是箭头函数的理想位置,特别是如果您生成的函数是有状态的,引用对象中的某些内容。例:
this.DOSomethingAsync().then((result) => {
  this.StoreResult(result);
});

对象转换

箭头函数的另一个常见且极其强大的用途是封装对象转换。 例如,在Vue.js中,有一种通用模式,用于将Vuex存储的各个部分直接包含在Vue组件中mapState。 这涉及定义一组“映射器”,它们将从原始的完整状态对象转换为准确地提取所讨论的组件所需的内容。 这些简单的转换是利用箭头功能的理想和美丽的地方。例:
export default {
  computed: {
    ...mapstate({
      results: state => state.results,
      users: state => state.users,
    });
  }
}

你不应该使用箭头功能的地方

在许多情况下,箭头功能不是一个好主意。他们不仅会帮助你,而且会给你带来麻烦的地方。 第一个是对象的方法。这是一个功能上下文的例子,this正是你想要的。 有一段时间使用类属性语法和箭头函数的组合作为创建“自动绑定”方法的方法,例如可以由事件处理程序使用但仍然绑定到类的方法。 这看起来像是这样的:
class Counter {
  counter = 0;

  handleClick = () => {
    this.counter++;
  }
}
通过这种方式,即使handleClick由事件处理程序而不是在实例的上下文中调用Counter,它仍然可以访问实例的数据。 这种方法的缺点是多方面的,在记录以及这个职位。 虽然使用这种方法确实为您提供了具有绑定功能的符合人体工程学的快捷方式,但该功能以多种不直观的方式运行,如果您尝试将此对象作为原型进行子类化/使用,则会阻止测试和创建问题。 相反,使用常规函数,如果需要,将其绑定到构造函数中的实例:
class Counter {
  counter = 0;

  handleClick() {
    this.counter++;
  }

  constructor() {
    this.handleClick = this.handleClick.bind(this);
  }
}

深度的Callchains

箭头函数可以让你遇到麻烦的另一个地方是它们将被用于许多不同的组合,特别是在函数调用的深链中。 核心原因与匿名函数相同 - 它们给出了非常糟糕的堆栈跟踪。 如果你的函数只是向下一级,比如在迭代器里面,那也不是太糟糕,但是如果你把所有的函数定义为箭头函数并在它们之间来回调用,你就会陷入困境遇到一个错误,只是收到错误消息,如:
{anonymous}()
{anonymous}()
{anonymous}()
{anonymous}()
{anonymous}()

动态上下文的功能

箭头函数可以让您遇到麻烦的最后一种情况this是动态绑定的地方。 如果您在这些位置使用箭头功能,那么动态绑定将不起作用,并且您(或稍后使用您的代码的其他人)可能会对事情未按预期工作的原因感到困惑。 一些关键的例子:
  • 调用事件处理程序并将其this设置为事件的currentTarget属性。
  • 如果您仍在使用jQuery,则大多数jquery方法都设置this为已选择的dom元素。
  • 如果您正在使用Vue.js,则方法和计算函数通常设置this为Vue组件。
当然你可以故意使用箭头函数来覆盖这种行为,但特别是在jQuery和Vue的情况下,这通常会干扰正常运行,让你感到困惑的是为什么看起来与附近其他代码相同的代码不起作用。

总结:箭头函数是JavaScript语言的一个非凡的补充,并且在许多情况下实现了更符合人体工程学的代码。 然而,像所有其他功能一样,它们有优点和缺点。我们应该将它们作为我们工具箱中的另一个工具,而不是作为所有功能的全面替代品。 觉得可用,就经常来吧!es6教程 脚本宝典 欢迎评论哦!巧夺天工,精雕玉琢。小宝典献丑了!    

脚本宝典总结

以上是脚本宝典为你收集整理的JavaScript箭头函数:如何,为什么,何时(何时不)使用它们全部内容,希望文章能够帮你解决JavaScript箭头函数:如何,为什么,何时(何时不)使用它们所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。