一、箭头函数与普通函数的区别?
1、基本语法于普通函数不同
- 函数声明方式不同
- 如果箭头函数没有参数,直接写一个空括号即可。
- 如果箭头函数的参数只有一个,也可以省去包裹参数的括号。
- 如果箭头函数有多个参数,将参数依次用逗号(,)分隔,包裹在括号中即可。
- 如果箭头函数的函数体只有一句代码,就是简单返回某个变量或者返回一个简单的JS表达式,可以省去函数体的大括号{ }。
2、箭头函数没有 prototype (原型),所以箭头函数本身没有this
// 箭头函数
let a = () => {};
console.log(a.prototype); // undefined
// 普通函数
function a() {};
console.log(a.prototype); // {constructor:f}
3、箭头函数不会创建自己的this箭头函数没有自己的this
箭头函数的this指向在定义(注意:是定义时,不是调用时)的时候继承自外层第一个普通函数的this。所以,箭头函数中 this 的指向在它被定义的时候就已经确定了,之后永远不会改变。
4、箭头函数不能作为构造函数
使用我们先了解一下构造函数的new都做了些什么?
简单来说,分为四步:
① JS内部首先会先生成一个对象;
② 再把函数中的this指向该对象;
③ 然后执行构造函数中的语句;
④ 最终返回该对象实例。
但是!!因为箭头函数没有自己的this,它的this其实是继承了外层执行环境中的this,且this指向永远不会随在哪里调用、被谁调用而改变,所以箭头函数不能作为构造函数使用,或者说构造函数不能定义成箭头函数,否则用new调用时会报错!
let Fun = (name, age) => {
this.name = name;
this.age = age;
};
// 报错
let p = new Fun('dingFY', 24);
5、箭头函数不绑定arguments
取而代之用rest参数…代替arguments
对象,来访问箭头函数的参数列表
箭头函数没有自己的arguments
对象。在箭头函数中访问arguments
实际上获得的是外层局部(函数)执行环境中的值。
// 普通函数
function A(a){
console.log(arguments);
}
A(1,2,3,4,5,8); // [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]
// 箭头函数
let B = (b)=>{
console.log(arguments);
}
B(2,92,32,32); // Uncaught ReferenceError: arguments is not defined
// rest参数...
let C = (...c) => {
console.log(c);
}
C(3,82,32,11323); // [3, 82, 32, 11323]
6、箭头函数不能用作Generator函数,不能使用yield关键字
-
let、const和var的概念与区别
-
变量提升与暂时性死区
-
变量的解构赋值
-
箭头函数及其this问题
-
Symbol概念及其作用
-
Set和Map数据结构
ES6的Set和Map数据结构,由你制造 -
Reflect对象
Reflect对象解析 -
Promise(手撕Promise A+规范、Promise.all、Promise相关API和方法)
异步Promise及Async/Await可能最完整入门攻略
重点从一道让我失眠的 Promise 面试题开始,深入分析 Promise 实现细节
手写一个Promise/A+,完美通过官方872个测试用例
手撕遵循 Promise/A+ 规范的 Promise -
Iterator和for…of(Iterator遍历器的实现)
ES6 迭代器(Iterator)和 for…of循环使用方法 -
循环语法比较及使用场景(for、forEach、for…in、for…of)
for、forEach、for…of、for…in 的区别与比较 -
Generator及其异步方面的应用
Generator 函数的含义与用法 -
async函数
async 函数的含义和用法 -
几种异步方式的比较(回调、setTimeout、Promise、Generator、async)
JS 异步编程六种方案 -
class基本语法及继承
-
模块加载方案比较(CommonJS和ES6的Module)
模块化 -
ES6模块加载与CommonJS加载的原理