遇事不决箭头函数?别期望“万金油”语法

2024-03-02 15:40

本文主要是介绍遇事不决箭头函数?别期望“万金油”语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

全文共1274字,预计学习时长6分钟

 

遇事不决箭头函数?别期望“万金油”语法

图源:unsplash

 

ES6箭头函数似乎是一种很上瘾的函数,一旦了解你很容易用到停不下来。作为2015年ECMAScript 6更新的一部分,箭头函数有充分理由迅速流行。箭头函数语法是极好的语法糖,能解决很多需求:

 

· 函数关键字

· 花括号

· return关键字(对于单行函数)

 

此外,箭头函数还降低了JavaScript的函数范围以及this关键字的部分复杂性,因为有时真正需要的只是一个匿名函数。

 

但事实上,箭头函数并不一定能解决编写JavaScript函数时的每一项需求。“万金油”函数是奢谈,下面就让我们深入探讨几个箭头函数不能解决的情况吧。

 

遇事不决箭头函数?别期望“万金油”语法

 

对象原型

 

先看JavaScript代码片段:

 

classRobot {constructor(name,catchPhrase) {this.name= name;this.catchPhrase= catchPhrase;}};Robot.prototype.speak= () => {console.log(this === window);return this.catchPhrase};const ironG =newRobot("Iron Giant", "Be good");ironG.speak();

 

第15行的函数调用如下:

 

true
undefined

 

定义了speak() 原型函数,并为新Robot对象传递了口号,那为什么这段代码的计算结果是未定义的呢?

 

console.log()揭示了原因。如你所见,当要求控制台判断(this === window)时,它返回true。这为上文对象方法示例中讨论的内容提供了依据。

 

当使用需要上下文的函数时,必须使用常规函数语法,以便使this正确绑定:

 

Robot.prototype.speak=function() {console.log(this === ironG); // truereturn this.catchphrase;};

 

遇事不决箭头函数?别期望“万金油”语法

图源:unsplash

 

遇事不决箭头函数?别期望“万金油”语法

 

对象方法

 

假设想要创建一个绑定到对象的方法。

 

const mario = {lives: 3,oneUp: () => {this.lives++;}}

 

这个例子中,如调用mario.oneUp(),mario.lives的值应该从3增加到4。然而,按照目前所写的代码,无论调用多少次oneUp(), lives的值都将保持不变。

 

为什么?正是因为this!

 

正如MDN所述:箭头函数自身没有this。使用了封闭词法范围的this值;箭头函数遵循正常的变量查找规则。因此,当搜索当前作用域中不存在的this时,箭头函数最终会从其封闭作用域中找到this。

 

例子中,封闭的范围是window对象。调用oneUp()会要求程序增加window对象中lives的值。这样的值不存在,所以代码不起作用。

 

相反,应该使用传统的函数语法,它将函数的this绑定到调用该函数的特定对象上:

 

const mario = {lives: 3,oneUp: function() {this.lives++;}};

 

遇事不决箭头函数?别期望“万金油”语法

 

动态上下文

 

最后一个例子:

 

const button = document.querySelector(#darkMode);button.addEventListener('click', () => {this.classList.toggle('on');});

 

到目前为止,你可能已经意识到这个代码无效及其原因。没错,这又和this有关。

 

箭头函数语法在函数声明时静态地绑定上下文,这与使用事件处理程序或事件监听器时试图实现的相反,它们本质上是动态的。

 

当通过事件处理程序或监听器操作DOM时,触发的事件指向属于目标元素的this。

 

对于全局执行上下文中定义的箭头函数,this将指向window。因此,上面的代码中,this.classList将被认为是window.classList,从而导致TypeError。

 

遇事不决箭头函数?别期望“万金油”语法

图源:unsplash

 

从这几个简单的例子中可以发现,JavaScript中关于this的内容值得研究,这也许会加深你对何时使用或不使用箭头函数的理解。

 

遇事不决箭头函数?别期望“万金油”语法

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

这篇关于遇事不决箭头函数?别期望“万金油”语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766617

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

pandas使用apply函数给表格同时添加多列

《pandas使用apply函数给表格同时添加多列》本文介绍了利用Pandas的apply函数在DataFrame中同时添加多列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、Pandas使用apply函数给表格同时添加多列二、应用示例一、Pandas使用apply函

Python中Namespace()函数详解

《Python中Namespace()函数详解》Namespace是argparse模块提供的一个类,用于创建命名空间对象,它允许通过点操作符访问数据,比字典更易读,在深度学习项目中常用于加载配置、命... 目录1. 为什么使用 Namespace?2. Namespace 的本质是什么?3. Namesp

MySQL中如何求平均值常见实例(AVG函数详解)

《MySQL中如何求平均值常见实例(AVG函数详解)》MySQLavg()是一个聚合函数,用于返回各种记录中表达式的平均值,:本文主要介绍MySQL中用AVG函数如何求平均值的相关资料,文中通过代... 目录前言一、基本语法二、示例讲解1. 计算全表平均分2. 计算某门课程的平均分(例如:Math)三、结合

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返