es6箭头函数讲解

s6箭头函数的用法

箭头函数是es6的一种函数的简写方法。

如下:

var f = v = > v;
//等同于
var f = function(v){
      return v;
}
var sum = (num1,num2) => num1+num2 ;
//等同于
var sum = function(num1,num2){
      return num1+num2
}
[1,2,3].map(function (x) {
      return x * x;
});
// 箭头函数写法
[1,2,3].map(x => x * x);//简洁了许多

从例子我们可以看出,省略了function,花括号‘{}’用‘=>’代替了。这种写法更简洁了。

除了简洁之外,箭头函数还有另外一个优点,就是函数体内的this的指向始终是指向定义它所在的对象,而不会指向调用它的对象,我们知道es5中的函数是谁执行它,它就指向谁。

es5  eg:

var countdown ={
         'count':10,
          'str':'hello!!!',
          showstr(){
             var _this = this;
             var dom = document.getElementById('dom');
             dom.innerHTML= _this.todouble(this.count);
              setInterval(function(){
                    var dom=document.getElementById('dom');
                    dom.innerHTML=_this.todouble(_this.count);
                    _this.count --;
                    if(_this.count <0){
                        dom.innerHTML=_this.str;
                    }
              },1000)
         },
         todouble(t){
                var t = parseInt(t);
                if(t<10){
                    return '0'+t;
                }else{
                    return t;
                }
        }
    }
    countdown.showstr();

如上是一个倒计时完之后显示一个hello文本的效果,在setInterval里面,如果我们直接写this的话,这个this是指向window的。因此我们需要在setInterval函数之前先保存_this = this;

当我们使用es6的箭头函数的时候,就可以直接使用this了

es6  eg:

 //es6的写法。
     var countdown ={
         'count':10,
          'str':'hello!!!',
          showstr(){
              var dom = document.getElementById('dom');
              dom.innerHTML= this.todouble(this.count);
              setInterval(() => {
                    dom.innerHTML= this.todouble(this.count);;
                    this.count --;
                    if(this.count <0){
                        dom.innerHTML=this.str;
                        return false;
                    }
              },1000)
           },
           todouble(t){
                var t = parseInt(t);
                if(t<10){
                    return '0'+t;
                }else{
                    return t;
                }
           }
    }
    countdown.showstr();

上面同样的代码改成箭头函数之后我们在setInterval里面就可以直接使用this了。

箭头函数里面的this装换成es5后的代码如下:

// ES6
function fn() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}
// ES5
function fn() {
  var _this = this;
  setTimeout(function () {
    console.log('id:', _this.id);
  }, 100);
}

上面代码中,转换后的ES5版本说明了,箭头函数里面根本没有自己的this,而是引用外层的this,由于箭头函数没有自己的this,所以也就不能用call()apply()bind()这些方法去改变this的指向。

箭头函数使用的注意的地方:

(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。

(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。因为箭头函数的this是由定义它的对象决定的,对象的构造函数是顶层的,它的外层,没有this可以传进去给箭头函数使用。

(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。

(4)不可以使用yield命令,因此箭头函数不能用作Generator函数。

你可能感兴趣的:(es6,前端,ecmascript)