与传统函数的不同之处
- 没有
this
、super
、arguments
和new.target
绑定。这些值由外围最近一层非箭头函数决定。- 不能通过
new
关键字调用- 没有原型
- 不可以改变
this
的绑定- 不支持
arguments
对象- 不支持重复的命名参数
为什么不能改变this的绑定?
// ES6
function foo() {
setTimeout(() => {
console.log('id:', this.id);
}, 100);
}
// ES5
function foo() {
var _this = this;
setTimeout(function () {
console.log('id:', _this.id);
}, 100);
}
因为箭头函数里面根本没有自己的this
,而是引用外层的this
。 所以不能用call()
、apply()
、bind()
这些方法去改变this
的指向。想要改变箭头函数内部this
的指向要通过改变外层this
的指向。
为什么不能通过new
关键字调用?
箭头函数没有[[Construct]]
方法,所以不能用作构造函数。
为什么没有原型?
由于不可以通过new
关键字调用箭头函数,因而没有构建原型的需求,所以箭头函数不存在prototype
这个属性。
尾调用优化
尾调用:函数作为另一个函数的最后一条语句被调用。
ES6缩减了严格模式下尾调用栈的大小(非严格模式下不受影响),如果满足以下条件,尾调用将不再创建新的栈帧,而是清除并重用当前栈帧:
- 尾调用不访问当前栈帧的变量(也就是说函数不是一个闭包)
- 在函数内部,尾调用是最后一条语句
- 尾调用的结果作为函数值返回
例子:这段代码满足上述三个条件,可以被JaveScript引擎自动优化
function doSomething(){
return doSomethingElse();//尾调用
}
可以结合ES6函数的扩展部分笔记