外形
箭头函数使用=>定义,普通函数则无
// 普通函数
function func() {
console.log('普通函数')
}
// 箭头函数
var a = () => {
console.log('箭头函数')
}
箭头函数只能是匿名函数
普通函数可以是具名函数,也可以是匿名函数;箭头函数只能是匿名函数
// 普通函数的具名函数
function func() {
console.log('普通具名函数')
}
// 普通函数的匿名函数
let a = function() {
console.log('普通函数匿名函数')
}
// 箭头函数只能是匿名函数
let b = () => {
console.log('箭头函数只能是匿名函数')
}
箭头函数不能用作构造函数,不能使用new
普通函数可以用作构造函数,以此来创建实例对象
function Person(name,age){
this.name=name;
this.age=age;
}
let admin=new Person("恩诺小弦",18);
console.log(admin.name); // 恩诺小弦
console.log(admin.age); // 18
Person用作构造函数,通过他能创建实例对象,但是构造函数不能用作构造函数
this
- 普通函数的this通常指向调用它的对象,当普通函数用作构造函数时,this指向实例化对象。
- 箭头函数本身是没有this的,但在声明的时候可以捕获所处的上下文的this供自己使用。 注:this一旦被捕获,就不会再发生改变
箭头函数例子
var webName="捕获成功";
let func=()=>{
console.log(this.webName);
}
func(); // 捕获成功
解释:该箭头函数在全局作用域中声明,所以捕获全局的this,this指向的是window
var name = "恩诺1";
function wrap(){
this.name="恩诺2";
let func=() => {
console.log(this.name);
}
func();
}
let en=new wrap(); // 恩诺2
解释:wrap作为构造函数,指向实例化对象(en),箭头函数func在普通函数wrap中声明,捕获的是内部this,所以打印的name指的是恩诺2
箭头函数不绑定arguments,取而代之用rest参数…解决
每一个普通函数调用后都具有一个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
let C = (...c) => {
console.log(c);
}
C(3,82,32,11323); // [3, 82, 32, 11323]
其他区别
- 箭头函数不能Generator函数,不能使用yeild关键字。
- 箭头函数不具有prototype原型对象。
- 箭头函数不具有super。
- 箭头函数不具有new.target。
总结
- 箭头函数的 this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()
- 普通函数的this指向调用它的那个对象