箭头函数表达式
试试看
语法
描述
//传统匿名函数 (功能(a){ 返回a+100; }); // 1. 删除单词“function”并将箭头放在参数和正文左大括号之间 (a) =>{ 返回a+100; }; // 2. 拆下车身支架和单词“return”-表示返回。 (a) =>a+100; // 3. 删除参数括号 a=>a+100;
//传统匿名函数 (函数(a,b){ 返回a+b+100; }); //箭头功能 (a,b)=>a+b+100; 常数a=4; 常数b=2; //传统匿名函数(无参数) (函数(){ 返回a+b+100; }); //箭头函数(无参数) ()=>a+b+100;
//传统匿名函数 (函数(a,b){ 常量卡盘=42; 返回a+b+卡盘; }); //箭头功能 (a,b)=>{ 常量卡盘=42; 返回a+b+卡盘; };
//传统功能 函数bob(a){ 返回a+100; } //箭头函数 常量bob2=(a)=>a+100;
功能体
常量函数=(x)=>x*x; //表达式正文语法,隐含“return” 常数函数2=(x,y)=>{ 返回x+y; }; //对于块体,需要显式的“return”
常量函数=()=>{foo:1}; //调用func()返回未定义的! constfunc2=()=>{foo:function(){}}; //SyntaxError:函数语句需要一个名称 常量函数3=()=>{foo(){}}; //语法错误:意外标记“{”
const func=()=>({foo:1});
不能用作方法
“使用严格”; 常量对象={ i: 10、, b: ()=>console.log(this.i,this), c(){ console.log(this.i,this); }, }; 对象b();// 日志未定义,窗口{/*…*/}(或全局对象) 对象c();// 日志10,对象{/*…*/}
“使用严格”; 常量对象={ a: 10、, }; 对象.defineProperty(obj,“b”{ 得到:()=>{ console.log(this.a,this.a的类型,this);// 未定义的“未定义”窗口{/*…*/}(或全局对象) 返回这个。a+10;// 表示全局对象“Window”,因此“this.a”返回“undefined” }, });
C类{ a=1; autoBoundMethod=()=>{ console.log(this.a); }; } const c=新c(); c.自动边界方法();// 1 const{autoBoundMethod}=c; autoBoundMethod();// 1 //如果它是一个普通方法,那么在这种情况下应该是未定义的
C类{ a=1; 建设者(){ this.method=this.meth.bind(this); } 方法(){ console.log(this.a); } }
没有参数绑定
不能用作构造函数
不能用作生成器
箭头前换行
常数函数=(a,b,c) => 1; //语法错误:意外标记“=>”
常数函数=(a,b,c)=> 1; 常数函数2=(a,b,c)=>( 1 ); 常数函数3=(a,b,c)=>{ 返回1; }; 常量函数4=( a、, b、, c、, ) => 1;
箭头的优先顺序
let回调; 回调=回调|()=>{}; //语法错误:无效的箭头函数参数
回调=回调(()=>{});
示例
使用箭头功能
//空箭头函数返回未定义的 常量空=()=>{}; (()=>“foobar”)(); //返回“foobar” //(这是立即调用的函数表达式) const simple=(a)=>(a>15?15:a); 简单(16);// 15 简单(10);// 10 常数最大值=(a,b)=>(a>b?a:b); //简单的阵列过滤、映射等。 常数arr=[5,6,13,0,1,18,23]; const sum=arr.reduce((a,b)=>a+b); // 66 常数偶数=arr.filter((v)=>v%2===0); // [6, 0, 18] const double=arr.map((v)=>v*2); // [10, 12, 26, 0, 2, 36, 46] //更简洁的承诺链 承诺 然后(a)=>{ // … }) 然后(b)=>{ // … }); //直观地更容易解析的无参数箭头函数 setTimeout(()=>{ console.log(“我很快就会发生”); setTimeout(()=>{ //深层代码 console.log(“稍后发生”); }, 1); }, 1);
使用调用、绑定和应用
常量对象={ 数量:100, }; //在global上设置“num”以显示如何不使用它。 globalThis.num=42; //操作“this”的简单传统函数 常量添加=函数(a、b、c){ 返回this.num+a+b+c; }; console.log(添加.call(obj,1,2,3));// 106 控制台.log(添加.apply(obj,[1,2,3]));// 106 const boundAdd=添加绑定(obj); console.log(boundAdd(1,2,3));// 106
常量对象={ 数量:100, }; //在globalThis上设置“num”以显示它是如何拾取的。 globalThis.num=42; //箭头功能 常量加法=(a,b,c)=>this.num+a+b+c; console.log(添加.call(obj,1,2,3));// 48 控制台.log(添加.apply(obj,[1,2,3]));// 48 const boundAdd=添加绑定(obj); console.log(boundAdd(1,2,3));// 48
常量对象={ 计数:10, 稍后做某事(){ setTimeout(函数(){ //函数在窗口作用域上执行 this.count++; console.log(this.count); }, 300); }, }; obj.doSomethingLater();// 记录“NaN”,因为属性“count”不在窗口范围内。
常量对象={ 计数:10, 稍后做某事(){ //方法语法将“this”绑定到“obj”上下文。 setTimeout(()=>{ //由于箭头函数没有自己的绑定 //setTimeout(作为函数调用)不创建绑定 //本身,使用外部方法的“obj”上下文。 this.count++; console.log(this.count); }, 300); }, }; obj.doSomethingLater();// 日志11
规格
浏览器兼容性
另请参见
功能 指导 功能 功能 功能 表达 ES6深入:箭头功能 关于hacks.mozilla.org(2015)