Js箭头函数 箭头函数是ES6
新增的语法,提供了一种更加简洁的函数书写方式,类似于匿名函数,并且简化了函数定义。
完整写法 完整写法类似于匿名函数,省略了function
关键字。
1 2 3 4 5 var s = (a,b ) => { console .log (a, b); return a + b; } s (1 ,2 );
1 2 3 4 5 6 var s = function (a,b ) { console .log (a, b); return a + b; } s (1 ,2 );
省略小括号 当参数只有1
个时,可以省略小括号,当没有参数或者两个以上的参时不能省略小括号。
1 2 3 4 5 var s = a => { console .log (a); return a + a; } s (1 );
1 2 3 4 5 6 var s = function (a ) { console .log (a); return a + a; } s (1 );
省略大括号 当函数体只有一行语句时,可以省略{}
,并且会自动return
这条语句的返回值。
1 2 3 4 var cmp = (a, b ) => a - b;var a = [5 , 4 , 3 , 2 , 1 ];var sortedArr = a.sort (cmp);console .log (sortedArr);
1 2 3 4 5 var cmp = function (a, b ) { return a - b; };var a = [5 , 4 , 3 , 2 , 1 ];var sortedArr = a.sort (cmp);console .log (sortedArr);
省略小括号与大括号 当满足上述两个条件时,小括号与大括号可以全部省略。
1 2 var s = a => a * 2 ;console .log (s (1 ));
1 2 3 var s = function (a ) { return a * 2 ; }console .log (s (1 ));
返回对象字面量 省略写法返回对象时注意需要使用()
将对象包裹,否则浏览器会把对象的{}
解析为箭头函数函数体的开始和结束标记。
1 2 var s = a => ({"a" : a * 2 });console .log (s (1 ));
1 2 3 var s = function (a ) { return {"a" : a * 2 }; }console .log (s (1 ));
没有单独的this 箭头函数没有单独的this
,在箭头函数的函数体中使用this
时,会取得其上下文context
环境中的this
。箭头函数调用时并不会生成自身作用域下的this
,它只会从自己的作用域链的上一层继承this
。由于箭头函数没有自己的this
指针,使用apply
、call
、bind
仅能传递参数而不能动态改变箭头函数的this
指向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var obj = { s1 : () => { console .log (this ); }, s2 : function ( ){ console .log (this ); } } obj.s1 (); obj.s2 ();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var contextObj = { e : function ( ) { var obj = { s1 : () => { console .log (this ); }, s2 : function ( ){ console .log (this ); } } obj.s1 (); obj.s2 (); } } contextObj.e ();
利用箭头函数的this
指向特点可以解决一些问题,例如常见的回调函数中this
指向问题。
1 2 3 4 5 6 7 8 9 10 11 12 var a = 1 ;var obj = { a : 2 , run : function ( ){ var callback = function ( ){ console .log (this .a ); } setTimeout (callback,1000 ); } } obj.run ();
对于这个问题可以将this
值分配给封闭的变量来解决。
1 2 3 4 5 6 7 8 9 10 11 12 var a = 1 ;var obj = { a : 2 , run : function ( ){ var that = this ; var callback = function ( ){ console .log (that.a ); } setTimeout (callback,1000 ); } } obj.run ();
也可以使用bind
来事先将函数执行时的this
绑定。
1 2 3 4 5 6 7 8 9 10 11 var a = 1 ;var obj = { a : 2 , run : function ( ){ var callback = function ( ){ console .log (this .a ); } setTimeout (callback.bind (this ),1000 ); } } obj.run ();
使用箭头函数可以直接编写回调函数而不改变this
指向,箭头函数不会创建自己的this
,它只会从自己的作用域链的上一层继承this
。
1 2 3 4 5 6 7 8 9 10 11 var a = 1 ;var obj = { a : 2 , run : function ( ){ var callback = ( ) => { console .log (this .a ); } setTimeout (callback,1000 ); } } obj.run ();
不绑定arguments 箭头函数不绑定arguments
,在箭头函数函数体内取得arguments
只是引用了封闭作用域内的arguments
,不会生成自身作用域下的this
和arguments
值。
1 2 3 4 5 6 7 8 9 10 11 12 function s (a,b ){ console .log (...arguments ); var ss1 = (c ) => { console .log (...arguments ); } var ss2 = function (c ){ console .log (...arguments ); } ss1 (3 ); ss2 (3 ); } s (1 , 2 );
不能用作构造器 箭头函数不能用作构造器,使用new
实例化时会抛出异常。
1 2 var s = ( ) => {};new s ();
没有原型属性 箭头函数没有prototype
属性。
1 2 var s = ( ) => {};console .log (s.prototype );
不能用作函数生成器 箭头函数不能用作Generator
,yield
关键字通常不能在箭头函数中使用,除非是嵌套在允许使用的函数内。
参考 1 2 3 https://segmentfault.com/a/1190000010159725 https://www.runoob.com/w3cnote/es6-function.html https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions