page contents

箭头函数与普通函数的区别?

轩辕小不懂 发布于 2021-12-17 13:58
阅读 401
收藏 0
分类:WEB前端开发
  • js
  • 2673
    Nen
    Nen
    - 程序员

    (1)箭头函数比普通函数更加简洁

    如果没有参数,就直接写一个空括号即可

    如果只有一个参数,可以省去参数的括号

    如果有多个参数,用逗号分割

    如果函数体的返回值只有一句,可以省略大括号

    如果函数体不需要返回值,且只有一句话,可以给这个语句前面加一个void关键字。最常见的就是调用一个函数:

    1 let fn = () => void doesNotReturn();

    (2)箭头函数没有自己的this

    箭头函数不会创建自己的this, 所以它没有自己的this,它只会在自己作用域的上一层继承this。所以箭头函数中this的指向在它在定义时已经确定了,之后不会改变。

    (3)箭头函数继承来的this指向永远不会改变

    var id = 'GLOBAL';

    var obj = {

     id: 'OBJ',

     a: function(){

     console.log(this.id);

     },

     b: () => {

     console.log(this.id);

     }

    };

    obj.a(); // 'OBJ'

    obj.b(); // 'GLOBAL'

    new obj.a() // undefined

    new obj.b() // Uncaught TypeError: obj.b is not a constructor

    对象obj的方法b是使用箭头函数定义的,这个函数中的this就永远指向它定义时所处的全局执行环境中的this,即便这个函数是作为对象obj的方法

    调用,this依旧指向Window对象。需要注意,定义对象的大括号{}是无法形成一个单独的执行环境的,它依旧是处于全局执行环境中。

    (4)call()、apply()、bind()等方法不能改变箭头函数中this的指向

    var id = 'Global';

    let fun1 = () => {

     console.log(this.id)

    };

    fun1(); // 'Global'

    fun1.call({id: 'Obj'}); // 'Global'

    fun1.apply({id: 'Obj'}); // 'Global'

    fun1.bind({id: 'Obj'})(); // 'Global'

    (5)箭头函数不能作为构造函数使用
    构造函数在new的步骤在上面已经说过了,实际上第二步就是将函数中的this指向该对象。 但是由于箭头函数时没有自己的this的,且this指向外层
    的执行环境,且不能改变指向,所以不能当做构造函数使用。
    (6)箭头函数没有自己的arguments
    箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是它外层函数的arguments值。
    请先 登录 后评论