箭头函数

ES6允许使用“箭头”(=>)定义函数。

基本语法:  函数名 = 参数 => 代码块

//ES5
var f = function(v) {
  return v;
};
//ES6
var f = v => v;

如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。

var f = () => 5;
// 等同于
var f = function () { return 5 };

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
  return num1 + num2;
};

//如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
var sum = (num1, num2) => { return num1 + num2; }

//由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。
var getTempItem = id => ({ id: id, name: "Temp" });

箭头函数的一个用处是简化回调函数。

// 正常函数写法
[1,2,3].map(function (x) {
  return x * x;
});

// 箭头函数写法
[1,2,3].map(x => x * x);

箭头函数有几个使用注意点:

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

(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。

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

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

箭头函数的this指向问题

在普通函数中,this的指向是在函数被调用的时候确定的,也就是执行上下文被创建时确定的。this总是指向调用该函数的对象

但在箭头函数中,this总是指向函数定义生效时所在的对象,是固定的。

//箭头函数
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}
//普通函数
function foo2(){
    setTimeout(function(){
        console.log('id:', this.id);
    },100);
}

function foo3(){
    var that = this;
    setTimeout(function(){
        console.log('id:', that.id);
    },100);
}

var id = 21;
//箭头函数中,this指向{ id: 42 }对象
foo.call({ id: 42 });   //id: 42 
//普通函数中,严格模式下this指向undefined,非严格模式下this指向window对象     
foo2.call({ id: 42 });  //id: undefined  非严格模式下 id: 21

foo3.call({ id: 42 });  //id: 42

this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。

 

posted @ 2017-07-10 15:03  gq_orange  阅读(193)  评论(0编辑  收藏  举报