《理解 ES6》阅读整理:函数(Functions)(四)Arrow Functions
箭头函数(Arrow Functions)
就像名字所说那样,箭头函数使用箭头(=>)来定义函数。与传统函数相比,箭头函数在多个地方表现不一样。
箭头函数语法(Arrow Function Syntax)
箭头函数有多种实现方法。比如你想实现一个只有一个参数并且直接返回此参数值的函数:
let reflect = value => value; //相当于下面的函数 let reflect = function(value) {
return value;
};
上面的例子中,函数只有一个参数,所以用不用()都是可以的。如果你的参数包含多个,就需要用()包住参数了:
let sum = (num1, num2) => num1 + num2; //相当于下面的函数 let sum = function(num1, num2) {
return num1 + num2;
};
另外如果函数没有参数,()也是必须的:
let getName = () => "Zakas"; //相当于下面的函数 let getName = function() {
return "Zakas";
};
如果函数体内包含多个表达式,那么就需要用{}包围住函数体了:
let sum = (num1, num2) => {
num1 = num1 + 3;
return num1 + num2;
}; //相当于下面的函数 let sum = function(num1, num2) {
num1 = num1 + 3;
return num1 + num2;
};
其实可以看到,箭头函数可以直接按照(参数)=> {函数体}的方式来写就可以了。上面的例子只是为了说箭头函数在某些情况下可以简写。
那么除了语法外,箭头函数与传统函数相比,有哪些不一样呢?
1、没有this、super、argument和new.target绑定
this、super、argument和new.target的值由最内层包含箭头函数的非箭头函数决定。首先来看arugments绑定:
function outer(num1, num2) {
return function () {
return arguments[0];
}
} let inner = outer(1, 2);
console.log(inner(3)); // ---------------------------------------------------------- function outer(num1, num2) {
return () => {
return arguments[0];
}
} let inner = outer(1, 2);
console.log(inner(3)); //
箭头函数本身没有arguments对象,实际上访问的是外层的outer函数的arguments对象,所以输出1。 不过在箭头函数中可以使用剩余参数访问函数的参数。
在JavaScript中,this绑定是一个比较复杂的机制,因为this具体指向的值要到实际执行时才能决定,并不一定是定义时所指向的值。在箭头函数中没有this绑定,其实就是指this的值在函数定义时就已经确定了,并不会在实际执行时改变值。来看一个例子:
function foo() {
return () => {
return this.a;
}
} var obj1 = {a: 2};
var obj2 = {a: 3}; var bar = foo.call(obj1);
console.log(bar.call(obj2)); //
上面的代码中,bar在创建时,this被绑定到obj1上,然后在执行时,this的值不会被重新绑定到obj2,因此输出2。如果里面的函数是传统函数,那么输出3。
new.target和super都是ES6引入的标准,在后面会进行说明。
2、没有prototype,不能被new调用
let foo = () => {}; console.log(foo.prototype); // undefined let obj = new foo(); // TypeError: foo is not a constructor
3、不允许重复命名的参数
不管是strict模式还是not-strict模式,箭头函数都不允许重复命名的参数:
let sum = (num1, num2, num1) => { // SyntaxError: Duplicate parameter name not allowed in this context
num1 = num1 + 3;
return num1 + num2;
};
《理解 ES6》阅读整理:函数(Functions)(四)Arrow Functions的更多相关文章
- 《理解 ES6》阅读整理:函数(Functions)(五)Name Property
名字属性(The name Property) 在JavaScript中识别函数是有挑战性的,因为你可以使用各种方式来定义一个函数.匿名函数表达式的流行使用导致函数调试困难,在栈信息中难以找出函数名. ...
- 《理解 ES6》阅读整理:函数(Functions)(一)Default Parameter Values
对于任何语言来说,函数都是一个重要的组成部分.在ES6以前,从JavaScript被创建以来,函数一直没有大的改动,留下了一堆的问题和很微妙的行为,导致在JavaScript中使用函数时很容易出现错误 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- JavaScript ES6 Arrow Functions(箭头函数)
1. 介绍 第一眼看到ES6新增加的 arrow function 时,感觉非常像 lambda 表达式. 那么arrow function是干什么的呢?可以看作为匿名函数的简写方式. 如: var ...
- 深入浅出ES6(七):箭头函数 Arrow Functions
作者 Jason Orendorff github主页 https://github.com/jorendorff 箭头符号在JavaScript诞生时就已经存在,当初第一个JavaScript教 ...
- ES6 箭头函数(Arrow Functions)
ES6 箭头函数(Arrow Functions) ES6 可以使用 "箭头"(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 具有一个参数的简单函 ...
- JS ES6中的箭头函数(Arrow Functions)使用
转载这篇ES6的箭头函数方便自己查阅. ES6可以使用“箭头”(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 基础语法 (参数1, 参数2, …, 参数N) => ...
- 箭头函数 Arrow Functions/////////////////////zzz
箭头符号在JavaScript诞生时就已经存在,当初第一个JavaScript教程曾建议在HTML注释内包裹行内脚本,这样可以避免不支持JS的浏览器误将JS代码显示为文本.你会写这样的代码: < ...
- ES6学习笔记(十四)Generator函数
清明时节雨纷纷,路上行人欲断魂. 借问酒家何处有,牧童遥指杏花村. 二零一九年农历三月初一,清明节. 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说 ...
随机推荐
- Centos 压缩、解压和打包命令
gzip命令 --功能说明:gz文件的压缩和解压缩. --命令格式:gzip [参数] <文件> --常用参数: -d 解开压缩文件 -l 列出压缩文件的相关信息 -q 不显示警告信息 - ...
- PHP读取Excel数据写入数据库(包含图片和文字)
public function test(){ $exts = 'xlsx'; //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入 import("Org ...
- JS--垒房子
垒房子的小游戏,还没加上得分选项,这是自己的练习笔记,留作笔记随时查看. <!DOCTYPE html><html> <head> <me ...
- [刘阳Java]_MyBatis_映射文件的常用标签总结_第5讲
MyBatis中常用标签的总结,简单给出自己的总结 MyBatis映射文件中的标签使用介绍1.<select>:用于编写查询语句用的标签 id:表示当前<select>标签的唯 ...
- transition与visibility之间的小tips
之前经常遇到这个问题,就是在用transition样式的时候经常不起作用,一个元素处于隐藏状态(display:none)时,通过添加一个class将元素显示出来,这样其实过度效果是不起作用的,懒做的 ...
- JavaScript数组的一些方法集合
数组方法集合 push()添加到数组末尾,并返回修改后数组的长度 var a=array.push('a','b'); alert(a);//2 pop() 移除数组最后一项,返回移除的项. shif ...
- 第四章 使用Docker镜像和仓库(二)
第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...
- 菜单的隐藏&显示
//还是先上万一老师的原代码 //隐藏与显示菜单Self.Menu := nil; {隐藏菜单} Self.Menu := MainMenu1; {显示菜单} //初一看到代码,我有点抓不到感觉的意思 ...
- 寒假学习计划(c++作业2)
C++学习计划 一.课程概况 1.课程名称:c++远征攻略 2.授课人姓名:james_yuan 3.课程链接地址:http://www.imooc.com/course/programdetail/ ...
- MSBuild Devenv 编译VC 工程
Devenv "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" dap_cp ...