美文网首页jsjs css html
箭头函数与普通函数(个人笔记)

箭头函数与普通函数(个人笔记)

作者: kevision | 来源:发表于2022-08-05 11:01 被阅读0次

    为什么不能new一个箭头函数


    箭头函数是ES6中提出来的,它没有prototype,也没有自己的this指向,更不可以使用arguments参数,所以不能new一个箭头函数。

    new操作符的实现步骤如下:

    1. 创建一个对象
    2. 将构造函数的作用域赋给新对象(也就是将对象的__proto__属性指向构造函数的prototype属性,但是箭头函数没有prototype属性)
    3. 指向构造函数中的代码,构造函数中的this指向该对象(也就是为这个对象添加属性和方法,但是箭头函数没有自己的this指向)
    4. 返回新的对象

    所以,上面的第二、三步,箭头函数都是没有办法执行的。

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


    (1)箭头函数比普通函数更加简洁
    (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值。
    (7)箭头函数没有prototype
    (8)箭头函数不能用作Generator函数,不能使用yeild关键字

    本文来源:https://juejin.cn/post/6940945178899251230

    相关文章

      网友评论

        本文标题:箭头函数与普通函数(个人笔记)

        本文链接:https://www.haomeiwen.com/subject/exbgirtx.html