深入理解箭头函数,学习其非常特殊且有用的特性

简介: 深入理解箭头函数,学习其非常特殊且有用的特性

640.png

深入理解箭头函数


让我们深入研究一下箭头函数。


箭头函数不仅仅是编写简洁代码的“捷径”。它还具有非常特殊且有用的特性。

JavaScript 充满了我们需要编写在其他地方执行的小函数的情况。

例如:


  • arr.forEach(func) —— forEach 对每个数组元素都执行 func
  • setTimeout(func) —— func 由内建调度器执行。
  • ……还有更多。


JavaScript 的精髓在于创建一个函数并将其传递到某个地方。

在这样的函数中,我们通常不想离开当前上下文。这就是箭头函数的主战场啦。


箭头函数没有 "this"


正如我们在 [对象方法,"this"](https://zh.javascript.info/object-methods "对象方法,"this"") 一章中所学到的,箭头函数没有 this。如果访问 this,则会从外部获取。


例如,我们可以使用它在对象方法内部进行迭代:


let group = {
  title: "Our Group",
  students: ["John", "Pete", "Alice"],
  showList() {
    this.students.forEach(
      student => alert(this.title + ': ' + student)
    );
  }
};
group.showList();


这里 forEach 中使用了箭头函数,所以其中的 this.title 其实和外部方法 showList 的完全一样。那就是:group.title


如果我们使用正常的函数,则会出现错误:


let group = {
  title: "Our Group",
  students: ["John", "Pete", "Alice"],
  showList() {
    this.students.forEach(function(student) {
      // Error: Cannot read property 'title' of undefined
      alert(this.title + ': ' + student)
    });
  }
};
group.showList();


报错是因为 forEach 运行它里面的这个函数,但是这个函数的 this 为默认值 this=undefined,因此就出现了尝试访问 undefined.title 的情况。

但箭头函数就没事,因为它们没有 this


不能对箭头函数进行 new 操作

不具有 this 自然也就意味着另一个限制:箭头函数不能用作构造器(constructor)。不能用 new 调用它们。

箭头函数 VS bind

箭头函数 => 和使用 .bind(this) 调用的常规函数之间有细微的差别:

  • .bind(this) 创建了一个该函数的“绑定版本”。
  • 箭头函数 => 没有创建任何绑定。箭头函数只是没有 thisthis 的查找与常规变量的搜索方式完全相同:在外部词法环境中查找。


箭头函数没有 "arguments"


箭头函数也没有 arguments 变量。


当我们需要使用当前的 thisarguments 转发一个调用时,这对装饰器(decorators)来说非常有用。


例如,defer(f, ms) 获得了一个函数,并返回一个包装器,该包装器将调用延迟 ms 毫秒:


function defer(f, ms) {
  return function() {
    setTimeout(() => f.apply(this, arguments), ms)
  };
}
function sayHi(who) {
  alert('Hello, ' + who);
}
let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("John"); // 2 秒后显示:Hello, John


不用箭头函数的话,可以这么写:


function defer(f, ms) {
  return function(...args) {
    let ctx = this;
    setTimeout(function() {
      return f.apply(ctx, args);
    }, ms);
  };
}


在这里,我们必须创建额外的变量 argsctx,以便 setTimeout 内部的函数可以获取它们。


总结


箭头函数:


  • 没有 this
  • 没有 arguments
  • 不能使用 new 进行调用
  • 它们也没有 super,但目前我们还没有学到它。我们将在 类继承[1] 一章中学习它。


这是因为,箭头函数是针对那些没有自己的“上下文”,但在当前上下文中起作用的短代码的。并且箭头函数确实在这种使用场景中大放异彩。

目录
相关文章
|
6月前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=>`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
42 5
|
3月前
|
开发者 Python
Python函数参数的魔法:揭秘如何用它们施展代码的无限可能!
【8月更文挑战第22天】Python函数参数展现了语言的强大与灵活。本文涵盖位置参数、默认参数、可变参数(*args)、关键字参数(**kwargs)及参数解包等,通过实例展示如何利用这些特性增强函数复用性与扩展性。类型注解的加入进一步提升了代码的可读性和健壮性。掌握这些技巧能帮助开发者写出更高效优雅的Python代码。
55 0
|
19天前
|
存储 JavaScript 前端开发
箭头函数和普通函数在性能方面有什么区别
【10月更文挑战第27天】箭头函数和普通函数在性能方面各有特点,箭头函数在某些场景下具有一定的性能优势,但在实际开发中,不能仅仅为了追求性能而盲目地选择箭头函数或普通函数,应该根据具体的应用场景、代码可读性和可维护性等多方面因素综合考虑来选择合适的函数定义方式。
29 2
|
5月前
|
JavaScript 前端开发 Java
函数形状的定义方式在编程中可以有多种,具体取决于使用的编程语言和上下文。以下是几种常见的定义方式:
函数形状的定义方式在编程中可以有多种,具体取决于使用的编程语言和上下文。以下是几种常见的定义方式:
41 3
|
自然语言处理 JavaScript 前端开发
JavaScript深度剖析之变量、函数提升:从表面到本质
JavaScript深度剖析之变量、函数提升:从表面到本质
|
6月前
|
自然语言处理 前端开发 算法
箭头函数与普通函数:谁更胜一筹?
箭头函数与普通函数:谁更胜一筹?
箭头函数与普通函数:谁更胜一筹?
|
6月前
|
JavaScript 前端开发 网络架构
JavaScript开发中ES6+新特性:解释箭头函数的作用以及它与普通函数的区别。
JavaScript开发中ES6+新特性:解释箭头函数的作用以及它与普通函数的区别。
72 1
|
6月前
|
JavaScript 前端开发
请解释JavaScript中的箭头函数,并给出一个使用箭头函数的例子。
请解释JavaScript中的箭头函数,并给出一个使用箭头函数的例子。
55 0
|
6月前
|
前端开发
【前端学习】—箭头函数和普通函数的区别(十四)
【前端学习】—箭头函数和普通函数的区别(十四)
|
前端开发
前端学习案例1-箭头函数的的定义
前端学习案例1-箭头函数的的定义
54 0
前端学习案例1-箭头函数的的定义