zoukankan      html  css  js  c++  java
  • ES6新特性之箭头函数与function的区别

    写法不同

    // function的写法
    function fn(a, b){
        return a+b;
    }
    
    // 箭头函数的写法
    let foo = (a, b) =>{ return a + b }
    

    this的指向不同

    在function中,this指向的是调用该函数的对象;

    //使用function定义的函数
    function foo(){
        console.log(this);
    }
    var obj = { aa: foo };
    foo(); //Window
    obj.aa() //obj { aa: foo }
    

    而在箭头函数中,this永远指向定义函数的环境。

    //使用箭头函数定义函数
    var foo = () => { console.log(this) };
    var obj = { aa:foo };
    foo(); //Window
    obj.aa(); //Window
    
    function Timer() {
      this.s1 = 0;
      this.s2 = 0;
      // 箭头函数
      setInterval(() => {
         this.s1++;
         console.log(this);
      }, 1000); // 这里的this指向timer
      // 普通函数
      setInterval(function () {
        console.log(this);
        this.s2++; // 这里的this指向window的this
      }, 1000);
    }
    
    var timer = new Timer();
    
    setTimeout(() => console.log('s1: ', timer.s1), 3100);
    setTimeout(() => console.log('s2: ', timer.s2), 3100);
    // s1: 3
    // s2: 0
    

    箭头函数不可以当构造函数

    //使用function方法定义构造函数
    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    var lenhart =  new Person(lenhart, 25);
    console.log(lenhart); //{name: 'lenhart', age: 25}
    
    //尝试使用箭头函数
    var Person = (name, age) =>{
        this.name = name;
        this.age = age;
    };
    var lenhart = new Person('lenhart', 25); //Uncaught TypeError: Person is not a constructor
    

    另外,由于箭头函数没有自己的this,所以当然也就不能用call()、apply()、bind()这些方法去改变this的指向。

    变量提升

    function存在变量提升,可以定义在调用语句后;

    foo(); //123
    function foo(){
        console.log('123');
    }
    

    箭头函数以字面量形式赋值,是不存在变量提升的;

    arrowFn(); //Uncaught TypeError: arrowFn is not a function
    var arrowFn = () => {
        console.log('456');
    };
    
    console.log(f1); //function f1() {}   
    console.log(f2); //undefined  
    function f1() {}
    var f2 = function() {}
    
  • 相关阅读:
    自动封箱和拆箱
    关于Java的一道内存的题目
    volatile关键字
    阶乘尾零
    Java之final的解析
    从1到n整数中1出现的次数
    最小安装雷达数量
    二叉树重建
    最短路径—Dijkstra算法
    PAT A1063——set的常见用法详解
  • 原文地址:https://www.cnblogs.com/codedisco/p/13153081.html
Copyright © 2011-2022 走看看