const func = value => value
复制代码
至关于java
const func = function(value) {
return value
}
复制代码
// 不传参数
const func = () => 'result'
// 等同于
const func = function () {
return 'result'
}
复制代码
// 多个参数
const sum = (a, b) => a + b
// 等同于
const func = function (a, b) {
return a + b
}
复制代码
// 函数有多条语句时用{}包裹
const foo = () => {
// do something
return 'result'
}
// 返回一个对象
const info = () => ({name: 'zyk', age: 24})
复制代码
// 与变量结构结合使用
const foo = ({firstName, lastName}) => 'fullName:' + firstName + lastName
foo({firstName: 'z', lastName: 'yk'}) // fullName:zyk
复制代码
普通函数中的this指向是在运行时基于函数的执行环境绑定的,也就是动态的。而箭头函数偏偏相反,箭头函数的this指向定义时所在的环境,它时静态固定的。 致使这个区别的缘由并非箭头函数内部有什么特殊的绑定机制,而是由于箭头函数没有本身的this,因此须要经过查找做用域链来肯定 this 的值,致使内部的this就是外层代码块的this。node
// 箭头函数中
function foo() {
setTimeout(() => {
console.log(this)
}, 0)
}
// 等同于普通函数
function foo() {
var that = this
setTimeout(function () {
console.log(that)
}, 0)
}
复制代码
arguments
对象因此在箭头函数内部使用arguments时会使用函数父级做用域中的arguments对象。若是想访问箭头函数的参数,可使用rest参数的形式访问框架
const foo = (...num) => console.log(num)
foo(1, 2, 3, 4) // [1, 2, 3, 4]
复制代码
JavaScript 函数有两个内部方法:[[Call]] 和 [[Construct]]。 当经过 new 调用函数时,执行 [[Construct]] 方法,建立一个实例对象,而后再执行函数体,将 this 绑定到实例上。 当直接调用的时候,执行 [[Call]] 方法,直接执行函数体。 箭头函数并无 [[Construct]] 方法,不能被用做构造函数,若是经过 new 的方式调用,会报错。函数
var Foo = () => {};
var foo = new Foo(); // TypeError: Foo is not a constructor
复制代码
虽然箭头函数很大程度上解决了this指向的困扰,推荐在编码中尽可能的使用箭头函数,但还有两个不适用的场景学习
能够经过这个例子进行解释ui
const obj = {
val: 1,
foo: () => console.log(this.val, this),
bar: function() {
console.log(this.val, this)
}
}
obj.foo() // undefined window
obj.bar() // 1 obj:{}
复制代码
能够看出对象的方法使用箭头函数时,因为对象不构成做用域,因此箭头函数内部的做用域根据做用域链查找最后绑定到了全局的做用域。所以不会获得预期的结果。this
var btn = document.getElementById('btn');
btn.addEventListener('click', () => {
this.classList.toggle('on');
});
复制代码
执行时会报错,由于btn的监听函数是一个箭头函数,致使里面的this就是全局对象。若是改为普通函数,this就会动态指向被点击的按钮对象编码