养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

wwwhj8828com18669144445,js-ES6箭头函数

时间:2024-10-21 15:55:41

js-ES6箭头函数我们先来回顾下箭头函数的基本语法。

wwwhj8828com18669144445,js-ES6箭头函数

工具/原料

js-ES6箭头函数

方法/步骤

1、ES6增加了箭头函数:

wwwhj8828com18669144445,js-ES6箭头函数

2、相当于:

wwwhj8828com18669144445,js-ES6箭头函数

3、如果需要给函数传入多个参数:

wwwhj8828com18669144445,js-ES6箭头函数

4、如果函数的代码块需要多条语句:

wwwhj8828com18669144445,js-ES6箭头函数

5、如果需要直接返回一个对象:

wwwhj8828com18669144445,js-ES6箭头函数

6、与变量解构结合:

wwwhj8828com18669144445,js-ES6箭头函数

7、很多时候,你可能想不到要这样用,所以再来举个例子,比如在React与Immutable的技术选型中,我们处理一个事件会这样做:

wwwhj8828com18669144445,js-ES6箭头函数

8、其实就可以简化为:

wwwhj8828com18669144445,js-ES6箭头函数

9、比较本篇我们重点比较一下箭头函数与普通函数。

10、主要区别包括:

11、1.冤铘讵柘没有this箭头函数没有this,所以需要通过查找作用域链来确定this的值。这就意味着如果箭头函数被非箭头函数包含,t茑霁酌绡his绑定的就是最近一层非箭头函数的this。模拟一个实际开发中的例子:我们的需求是点击一个按钮,改变该按钮的背景色。为了方便开发,我们抽离一个Button组件,当需要使用的时候,直接:

wwwhj8828com18669144445,js-ES6箭头函数

12、HTML代码如下:

wwwhj8828com18669144445,js-ES6箭头函数

13、JavaScript代码如下:

wwwhj8828com18669144445,js-ES6箭头函数

14、看着好像没有问题,结果却是报错UncaughtTypeError:Cannotr娣定撰钠eadproper墉掠载牿ty'style'ofundefined这是因为当使用addEventListener()为一个元素注册事件的时候,事件函数里的this值是该元素的引用。

15、所艮劁飨戽以如果我们在setBgColor中console.log(this),this指向的是按钮元素,那this.element就是undefined,报错自然就理所当然了。

16、也许你会问,既然this都指向了按钮元素,那我们直接修改setBgColor函数为:

wwwhj8828com18669144445,js-ES6箭头函数

17、不就可以解决这个问题了?

18、确实可以这样做,但是在实际的开发中,我们可能会在setBgColor中还调用其他的函数,比如写成这种:

wwwhj8828com18669144445,js-ES6箭头函数

19、所以我们还是希望setBgColor中的this是指向实例对象的,这样就可以调用其他的函数。

20、利用ES5,我们一般会这样做:

wwwhj8828com18669144445,js-ES6箭头函数

21、为避免addEventListener的影响,使用bind强制绑定setBgColor()的this为实例对象

22、使用ES6,我们可以更好的解决这个问题:

wwwhj8828com18669144445,js-ES6箭头函数

23、由于芟镊圭薅箭头函数没有this,所以会向外层查找this的值,即bindEvent中的this,此时this指向实例对象,所以可以正确的调用th足毂忍珩is.setBgColor方法,而this.setBgColor中的this也会正确指向实例对象。

24、在这里再额外提一点,就是注意bindEvent和setBgColor在这里捂执涡扔使用的是普通函数的形式,而非箭头函数,如果我们改成箭头函数,会导致函数里的this指向window对象惺绅寨瞀(非严格模式下)。

25、最后,因为箭头函数没有this,所以也不能用call()、apply()、bind()这些方法改变this的指向,可以看一个例子:

wwwhj8828com18669144445,js-ES6箭头函数

26、2.冤铘讵柘没有arguments箭头函数没有自己的arguments对象,这不一定是件坏事,因为箭头函数可以访问外围函数的arguments对象:

wwwhj8828com18669144445,js-ES6箭头函数

27、那如果我们就是要访问箭头函数的参数呢?

28、你可以通过命名参数或者rest参数的形式访问参数:

wwwhj8828com18669144445,js-ES6箭头函数

29、3.不能通过new关键字调用

30、JavaScript函数有两个内部方法:[[Call觥终柯计]]和[[Construct]]。当通过new调用函数时,执行[[Construct]]方法,创建一个实例对象,然后再执行挣窝酵聒函数体,将this绑定到实例上。当直接调用的时候,执行[[Call]]方法,直接执行函数体。

31、箭头函数并没有[[Construct]]方法,不能被用作构造函数,如果通过new的方式调用,会报错。

wwwhj8828com18669144445,js-ES6箭头函数

32、4.没有new.target因为不能使用new调用,所以也没有new.target值。

33、5.没有原型

34、由于不能使用new调用箭头函数,所以也没有构建原型的需求,于是箭头函数也不存在prototype这个属性。

wwwhj8828com18669144445,js-ES6箭头函数

35、6.没有s掼鸿乡羰uper连原型都没有,自然也不能通过super来访问原型的属性,所以箭头函数也是没有super的,不过跟this、a鸡堕樱陨rguments、new.target一样,这些值由外围最近一层非箭头函数决定。

36、最后,关于箭头函数,引用MDN的介绍就是:

wwwhj8828com18669144445,js-ES6箭头函数

37、翻译过来就是:箭头函数表达式的语法比函数表达式更短,并且粲茸锿枋不绑定自己的this,arguments,super或new.ta鸡堕樱陨rget。这些函数表达式最适合用于非方法函数(non-methodfunctions),并且它们不能用作构造函数。

38、那么什么是non-methodfunctions呢?

39、我们先来看看method的定义:

wwwhj8828com18669144445,js-ES6箭头函数

40、对象属性中的函数就被称之为method,那么no艘绒庳焰n-mehtod就是指不被用作对象属性中的函数了,可是为什么说箭头函数更适合non-method呢?

41、让我们来看一个例子就明白了:

wwwhj8828com18669144445,js-ES6箭头函数

42、自执行函数

43、自执行函数的形式为:

wwwhj8828com18669144445,js-ES6箭头函数

44、或者

wwwhj8828com18669144445,js-ES6箭头函数

45、利用箭头简化自执行函数的写法:

wwwhj8828com18669144445,js-ES6箭头函数

46、但是注意:使用以下这种写法却会报错:

wwwhj8828com18669144445,js-ES6箭头函数

© 一点知识