让我们更深入地了解箭头函数。箭头函数不仅仅是编写干净代码的“捷径”。它还具有非常特殊和有用的属性。JavaScript充满了我们需要编写在别处执行的小函数的情况。例如:arr.forEach(func)-forEach在每个数组元素上执行func。setTimeout(func)–func由内置调度程序执行。……还有更多。JavaScript的本质是创建一个函数并将它传递到某个地方。在这样的函数中,我们通常不想离开当前上下文。这是箭头函数的主战场。1.箭头函数没有“this”正如我们在“对象方法”一章中学到的,“this”,箭头函数没有this。如果访问这个,就会从外部获取到。例如,我们可以使用它在对象方法内部进行迭代:letgroup={title:"OurGroup",students:["John","Pete","Alice"],showList(){this.students.forEach(student=>alert(this.title+':'+student));}};group.showList();这里forEach中使用了箭头函数,所以this.title和外部方法showList完全一样。即:群。标题。如果我们使用普通函数,我们会得到一个错误:letgroup={title:"OurGroup",students:["John","Pete","Alice"],showList(){this.students.forEach(function(student){//Error:Cannotreadproperty'title'ofundefinedalert(this.title+':'+student)});}};group.showList();报错是因为forEach运行的是里面的函数,但是this的thisfunctionis默认值是this=undefined,所以会尝试访问undefined.title。但是箭头函数很好,因为它们没有这个。不能在箭头函数上new没有this这当然意味着另一个限制:箭头函数不能用作构造函数。不能用new调用它们。箭头函数VSbind箭头函数=>和使用.bind(this)调用的常规函数??之间存在细微差别:.bind(this)创建函数的“绑定版本”。箭头函数=>不创建任何绑定。箭头函数没有这个。它的查找方式与常规变量完全相同:在外部词法环境中。2.箭头函数没有“参数”箭头函数没有参数变量。当我们需要使用当前的this和参数转发调用时,这对装饰器很有用。例如,defer(f,ms)接受一个函数并返回一个将调用延迟ms毫秒的包装器:functiondefer(f,ms){returnfunction(){setTimeout(()=>f.apply(this,arguments),ms)};}functionsayHi(who){alert('Hello,'+who);}letsayHiDeferred=defer(sayHi,2000);sayHiDeferred("John");//2秒后显示:Hello,IfJohndoesnot使用箭头函数,他可以这样写:;};}这里我们必须创建额外的变量args和ctx以便setTimeout中的函数可以获取它们。3.总结箭头函数:没有this,没有参数,不能用new调用,也没有super,但是我们还没学会。我们将在类继承章节中了解它。这是因为箭头函数适用于没有自己的“上下文”但在当前上下文中工作的简码。箭头函数在这个用例中真的很出色。
