浅浅的分析下es6箭头函数
原文链接:http://damobing.com/?p=589
前言
箭头函数作为es6重点的语法内容之一,很多开发者对其爱不释手,当也要注意其可能存在的问题,其正确的使用场景,否则会引起不必要的bug。
语法
//场景1 没有参数,空的小括号,返回值不用加 return,也就是说支持单一表达式,如果加return 需要构成语句
var demo=()=>5675;
//场景2 :只有一个参数 ,小括号省略
var demo=num1=>5675;
//场景3:有多个参数
var demo=(num1,num2)=>5675;
//场景 4 :有多个参数 ,并且需要语句块
var demo=(num1,num2)=>{
if(num1<num2){
return num1
}else{
return 2
}
}
//场景5 :需要返回的为对象时需要两队花括号来区分对象以及本身的语句块
var demo=()={{
name:1,
version:2
}}
特点
无this
箭头函数不会创建自己的this;它使用封闭执行上下文的this值。
适用场景
以下逻辑参考《你不知道的js》,请根据自己的需要进行选择是否使用箭头函数。
简单的理解上面的逻辑图大概就是这样的几个前提:
1 确定参数是固定的,没有默认值,没有rest参数收集器,如果有的话 ,也可以用一对小括号来归纳,对于整个团队你的参数是明显可知可控的。
2 简单的流式逻辑图,没有过多的逻辑或者业务判断
3 方法体比较简单,只是单个或者简单的表达语句
4 返回值是比较简单的基本数据类型,如果是对象需要额外的大括号,其他的返回内容也是额外注意的,无论哪种请保证你的返回值是明确的、可读的。
不适用场景
定义对象方法
一般情况下如果想定义对象下的函数,是多少涉及使用对象中的其他属性的,如果用箭头函数会因为对象无法形成作用域,没有相关上下文,导致this指向全局。特别需要说明的一点是,如果你对象属性方法中需要定义方法,同时想使用对象属性,那么此时建议使用箭头函数。代码参考如下:
- 字面直接量
let person={
name:'zhangsan',
say1:()=>{
console.log(this.name)
},
say2:function(){
console.log(this.name)
},
say3:function(){
return ()=>{
console.log(this.name)
}
},
say4:function(){
return function(){
console.log(this.name)
}
}
}
person.say1()//全局
person.say2()//对象
person.say3()()//对象
person.say4()()//全局
- 原型对象
function animal(){
this.name='animal'
}
animal.prototype.run=()=>{
console.log('animal:'+this.name)
}
animal.prototype.run2=function(){
console.log('animal:'+this.name)
}
var dog=new animal();
dog.run()//codepen
dog.run2()//animal
定义事件的回调事件
此时用this唤起的是全局对象,而用传统方式是获取到的事件元素。
var btn=document.getElementById("btn"),
btn2=document.getElementById("btn2");
btn.addEventListener("click",function(){
console.log(this)
})
btn2.addEventListener("click",()=>{
console.log(this)
})
构造器函数
因为箭头函数无法形成作用域,所以在实例化的时候构造器会失败,不能使用箭头函数实现构造器,真实的使用会报错。
let bird=()=>{
console.log(this)
}
let xique=new bird()//bird is not a constructor
逻辑判断过于复杂
这时候逻辑过于复杂使用箭头函数会导致代码结构不清楚,建议使用原始的结构。
比如以下场景:
1 业务或者语法判断过于复杂
2 返回值情况很复杂
建议
尽管箭头函数和let、const以及一些es6语法变得风行,甚至于有些人觉得用箭头函数就觉得自己的技术进阶了,其实不然,大多人人还是停留在了它写法上的便利,并没有了解好其真正的使用场景。
总之,个人的建议是:上面提到的几种不适合的场景不要用箭头函数。箭头函数适用于那些参数业务逻辑以及返回值都简单的方法的实现。它本质我个人认为就是一段函数的简化写法,最大的利好在于传递了当前对象,避免了之前很多类似于var that=this ,self = this
的写法。
参考文档
文末福利:
福利一:前端,Java,产品经理,微信小程序,Python等100G资源合集大放送:https://www.jianshu.com/p/e8197d4d9880
福利二:微信小程序入门与实战全套详细视频教程。
【领取方法】
关注 【编程微刊】微信公众号:
回复【小程序demo】一键领取130个微信小程序源码demo资源。
回复【领取资源】一键领取前端,Java,产品经理,微信小程序,Python等资源合集100G资源大放送。
浅浅的分析下es6箭头函数的更多相关文章
- es6箭头函数 this 指向问题
es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){ ...
- ES6 — 箭头函数
一 为什么要有箭头函数 我们在日常开发中,可能会需要写类似下面的代码 const Person = { 'name': 'little bear', 'age': 18, 'sayHello': fu ...
- 前端分享----JS异步编程+ES6箭头函数
前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...
- this(ES6箭头函数里的this)
一,了解前须知 1,箭头函数:出现的作用除了让函数的书写变得很简洁,可读性很好外:最大的优点是解决了this执行环境所造成的一些问题.比如:解决了匿名函数this指向的问题(匿名函数的执行环境具有全局 ...
- ES6箭头函数与this指向
一.ES6箭头函数 ES6之前的语法想要定义一个函数,如图example1,ES6之后定义一个函数如图example2,相比较之下简洁了很多 二.函数的this指向 非箭头函数,谁调用函数this指向 ...
- ES6 箭头函数及this
ES6 箭头函数及this 1.箭头函数 <script type="text/javascript"> //以前定义函数 let fun=function () { ...
- es6箭头函数讲解
es6箭头函数的用法 箭头函数是es6的一种函数的简写方法. 如下: var f = v = > v; //等同于 var f = function(v){ return v; } var su ...
- ES6 箭头函数 this 指向
ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...
- ES6 箭头函数(Arrow Functions)
ES6 箭头函数(Arrow Functions) ES6 可以使用 "箭头"(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 具有一个参数的简单函 ...
随机推荐
- Kinect 开发 —— 骨骼追踪 (下)
基于景深数据的用户交互 骨骼数据中关节点不仅有X,Y值,还有一个深度值 除了使用WPF的3D特性外,在布局系统中可以根据深度值来设定可视化元素的尺寸大小来达到某种程序的立体效果. 下面的例子使用Can ...
- 微信小程序从零开始开发步骤(三)底部导航栏
上一章节,我们分享了如何创建一个新的页面和设置页面的标题,这一章我们来聊聊底部导航栏是如何实现的.即点击底部的导航,会实现不同对应页面之间的切换. 我们先来看个我们要实现的底部导航栏的效果图:(三个导 ...
- View_01_LayoutInflater的原理、使用方法
View_01_LayoutInflater的原理.使用方法 本篇博客是郭神博客Android视图状态及重绘流程分析,带你一步步深入了解View(一)的读书笔记的笔记. LayoutInflater简 ...
- Vue 学习记录<2>
一.Vue https://vue-loader.vuejs.org/zh-cn/ https://vuejs-templates.github.io/webpack/structure.html
- Linux 安装Nginx具体图解教程
系统:Centos6.6 64位 Nginx: http://nginx.org/en/download.html 眼下最新版本号1.9.4 我下载1.8.0 watermark/2/text/a ...
- 解决Firefox不信任StartSSL证书问题
从2016年的11月份开始,firefox \ chrome \ apple 等陆续不再信任 StartSSL 的证书,导致一些使用 StartSSL 的证书的网站访问遇到了麻烦, firefo ...
- RecipientsEditor-信息收件人输入框
首先说一下信息收件人这个类的继承关系 RecipientsEditor->EncapsulatedMTKRecipientEditTextView(这两个类都在mms目录下) ->MTKR ...
- Java 8 Stream Tutorial--转
原文地址:http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ This example-driven tutori ...
- Vue的全选功能实现思路
全选功能的实现主要分两步: 1. 点击全选框选中所有选择框. 2. 当所有选择框都被选中时,勾选全选框. 详细思路: 1. 点击全选框选中所有选择框: 给全选框绑定一个值,然后添加change时间,当 ...
- 【Educational Codeforces Round 35 A】 Nearest Minimums
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 找出最小的数字的位置. 最近的肯定是相邻的某对. [代码] #include <bits/stdc++.h> using ...