es6的箭头函数

箭头函数

  • ES6 最有意思的一个新部分就是箭头函数( arrow function )。箭头函数正如名称所示那样
    使用一个“箭头”( => )来定义,但它的行为在很多重要方面与传统的 JS 函数不同:
    没有 this 、 super 、 arguments ,也没有 new.target 绑定: this 、 super 、
    arguments 、以及函数内部的 new.target 的值由所在的、最靠近的非箭头函数来决定
    ( super 详见第四章)。
  • 不能被使用 new 调用: 箭头函数没有 [[Construct]] 方法,因此不能被用为构造函
    数,使用 new 调用箭头函数会抛出错误。
  • 没有原型: 既然不能对箭头函数使用 new ,那么它也不需要原型,也就是没有
    prototype 属性。
  • 不能更改 this : this 的值在函数内部不能被修改,在函数的整个生命周期内其值会
    保持不变。
  • 没有 arguments 对象: 既然箭头函数没有 arguments 绑定,你必须依赖于具名参数或
    剩余参数来访问函数的参数。
  • 不允许重复的具名参数: 箭头函数不允许拥有重复的具名参数,无论是否在严格模式
    下;而相对来说,传统函数只有在严格模式下才禁止这种重复。

产生这些差异是有理由的。首先并且最重要的是,在 JS 编程中 this 绑定是发生错误的常
见根源之一,在嵌套的函数中有时会因为调用方式的不同,而导致丢失对外层 this 值的追
踪,就可能会导致预期外的程序行为。其次,箭头函数使用单一的 this 值来执行代码,使
得 JS 引擎可以更容易对代码的操作进行优化;而常规函数可能会作为构造函数使用(导致
this 易变而不利优化)。
其余差异也聚集在减少箭头函数内部的错误与不确定性,这样 JS 引擎也能更好地优化箭头函
数的运行。

注意:箭头函数也拥有 name 属性,并且遵循与其他函数相同的规则。

箭头函数语法

箭头函数的语法可以有多种变体,取决于你要完成的目标。所有变体都以函数参数为开头,
紧跟着的是箭头,再接下来则是函数体。参数与函数体都根据实际使用有不同的形式。例
如,以下箭头函数接收单个参数并返回它:

var reflect = value => value;
// 有效等价于:
var reflect = function(value) {
return value;
};

当箭头函数只有单个参数时,该参数可以直接书写而不需要额外的语法;接下来是箭头以及
箭头右边的表达式,该表达式会被计算并返回结果。即使此处没有明确的 return 语句,该
箭头函数仍然会将所传入的参数返回出来。
如果需要传入多于一个的参数,就需要将它们放在括号内,就像这样:

var sum = (num1, num2) => num1 + num2;
// 有效等价于:
var sum = function(num1, num2) {
return num1 + num2;
};

sum() 函数简单地将两个参数相加并返回结果。此箭头函数与上面的 reflect() 之间唯一区
别在于:此处的参数被封闭在括号内,相互之间使用逗号分隔(就像传统函数那样)。
如果函数没有任何参数,那么在声明时就必须使用一对空括号,就像这样:

var getName = () => "Nicholas";
// 有效等价于:
var getName = function() {
return "Nicholas";
};

当你想使用更传统的函数体、也就是可能包含多个语句的时候,需要将函数体用一对花括号
进行包裹,并明确定义一个返回值,正如下面这个版本的 sum() :

return num1 + num2;
};
// 有效等价于:
var sum = function(num1, num2) {
return num1 + num2;
};

你基本可以将花括号内部的代码当做传统函数那样对待,除了 arguments 对象不可用之外。
若你想创建一个空函数,就必须使用空的花括号,就像这样:

var doNothing = () => {};
// 有效等价于:
var doNothing = function() {};

花括号被用于表示函数的主体,它在你至今看到的例子中都工作正常。但若箭头函数想要从
函数体内向外返回一个对象字面量,就必须将该字面量包裹在圆括号内,例如:

var getTempItem = id => ({ id: id, name: "Temp" });
// 有效等价于:
var getTempItem = function(id) {
return {
id: id,
name: "Temp"
};
};

将对象字面量包裹在括号内,标示了括号内是一个字面量而不是函数体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值