当前位置:   article > 正文

前端开发--箭头函数_前端箭头函数

前端箭头函数

#博学谷IT学习技术支持#

目录

箭头函数基本使用

利用箭头函数直接返回对象

箭头函数中this的问题

箭头函数不适合的场景

箭头函数基本使用

在ES6中可以使用 “箭头”(=>)来定义函数。

使用传统的方式定义一个函数。

示例代码如下:

  1. // 使用传统方式定义函数
  2. let f = function(x, y) {
  3. return x + y;
  4. }
  5. console.log(f(3, 6));

通过上面的代码,可以发现传统方式来定义函数的时候,比较麻烦。

箭头函数的使用

  1. let f = (x, y) => {
  2. return x + y
  3. };
  4. console.log(f(9, 8));

在调用f这个函数的时候,将9和8传递给了x,y这两个参数,然后进行加法运算。

如果参数只有一个,可以省略小括号。

  1. let f = num => {
  2. return num / 2;
  3. }
  4. console.log(f(6));

如果没有参数,只需要写一对小括号就可以。

  1. let f = () => {
  2. return 9 / 3;
  3. }
  4. console.log(f());

上面我们写的代码中,发现函数体中只有一条语句,那么这时是可以省略大括号的。

  1. let f = (x, y) => x + y;
  2. console.log(f(3, 6));

把上面的代码转换成ES5的写法,发现和我们前面写的代码是一样的。

  1. var f = function f(x, y) {
  2. return x + y;
  3. };
  4. console.log(f(3, 6));

利用箭头函数直接返回对象

如果希望箭头函数直接返回一个对象,应该怎样写呢?

你可能认为很简单,可以采用如下的写法

  1. let f = (id, name) => {
  2. id: id,
  3. userName: name
  4. };
  5. console.log(f(1, 'zs'));

但是上面的写法是错误的,因为这时大括号被解释为代码块,解决的办法是:在对象外面加上小括号,

所以,正确的写法如下:

  1. let f = (id, name) => ({
  2. id: id,
  3. userName: name
  4. });
  5. console.log(f(1, 'zs'));

通过打印,发现输出的是一个对象。

可以采用如下的写法

  1. let f = (id, name) => {
  2. return {
  3. id: id,
  4. userName: name
  5. }
  6. };
  7. console.log(f(1, 'zs'));

箭头函数中this的问题

  1. let person = {
  2. userName: 'ls',
  3. getUserName() {
  4. console.log(this.userName)
  5. }
  6. }
  7. person.getUserName();

以上代码执行的结果为:'ls',并且在该程序中this 为当前的person对象。

将上面的代码修改一下,要求延迟1秒钟以后,再输出用户名的名称

  1. let person = {
  2. userName: 'ls',
  3. getUserName() {
  4. setTimeout(function() {
  5. console.log(this.userName)
  6. }, 1000)
  7. }
  8. }
  9. person.getUserName();

上面的输出结果为:undefined,因为在setTimeout中this指的是window,而不是person对象。

可以将代码进行如下的修改:

  1. let person = {
  2. userName: 'ls',
  3. getUserName() {
  4. let that = this;
  5. setTimeout(function() {
  6. console.log(that.userName)
  7. }, 1000)
  8. }
  9. }
  10. person.getUserName();

在进入setTimeout这个方法之前,提前将this赋值给that变量,然后在setTimeout中使用that,那么这时that指的就是person对象。

上面的解决方法比较麻烦,可以修改成箭头函数的形式,代码如下所示:

  1. let person = {
  2. userName: 'wangwu',
  3. getUserName() {
  4. setTimeout(() => {
  5. console.log(this.userName);
  6. },1000)
  7. }
  8. }
  9. person.getUserName();

通过上面的代码,可以发现在箭头函数中直接使用this是没有问题的。

在箭头函数中是没有this的,如果在箭头函数中使用了this,那么实际上使用的是外层代码块的this. 箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this

找出定义箭头函数的上下文(即包含箭头函数最近的函数或者是对象),那么上下文所处的父上下文即为this.

setTimeout函数中使用了箭头函数,箭头函数中用了this,而这时this指的是外层代码块也就是person ,所以箭头函数中使用的this指的就是person

箭头函数不适合的场景

第一:不能作为构造函数,不能使用new操作符

构造函数是通过new操作符生成对象实例的,生成实例的过程也是通过构造函数给实例绑定this的过程,而箭头函数没有自己的this,因此不能使用箭头函数作为构造函数。

如下代码:

  1. function Person(name) {
  2. this.name = name;
  3. }
  4. var p = new Person("zhangsan"); //正常

以上是我们前面经常使用的一种方式,没有问题

使用箭头函数作为构造函数时的情况

  1. let Person = (name) => {
  2. this.userName = name;
  3. };
  4. let p = new Person("lisi");

当执行上面的程序的时候,会出现错误

第二:没有prototype属性

因为在箭头函数中没有this,也就不存在自己的作用域,因此箭头函数是没有prototype属性的。

  1. let Person = (name) => {
  2. this.userName = name;
  3. };
  4. console.log(Person.prototype); // undefined

第三:不适合将原型函数定义成箭头函数

在给构造函数添加原型函数时,如果使用箭头函数,其中的this会指向全局作用域window,而不会指向构造函数。

因此并不会访问到构造函数本身,也就无法访问到实例属性,失去了原型函数的意义。

  1. function Person(name) {
  2. this.userName = name;
  3. }
  4. Person.prototype.sayHello = () => {
  5. console.log(this); // window
  6. console.log(this.userName); // undefined
  7. };
  8. let p = new Person("zhangsan");
  9. p.sayHello();
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/115841
推荐阅读
相关标签
  

闽ICP备14008679号