一.箭头函数和普通函数

箭头函数相当于匿名函数,并且简化了函数定义。
箭头函数有两种格式,一种只包含一个表达式,连{ … }和return都省略掉了。
还有一种可以包含多条语句,这时候就不能省略{ … }和return。
let fun = () => {console.log('111');
}
function fun() {   //普通函数console.log('123');
}

二、箭头函数和普通函数的区别

1. 箭头函数不能作为构造函数,而普通函数可以:

箭头函数是匿名函数,不能作为构造函数,不能使用new

let a = function(){console.log('a');
}
let b = () => {console.log('b');
}
console.log(a.prototype)  // {constructor: ƒ}
console.log(b.prototype)  // undefinedlet a1 = new a();
let b1 = new b(); //b is not a constructor

2.箭头函数没有原型,而普通函数有

3.箭头函数不绑定arguments,取而代之用rest参数…解决;普通函数argument绑定了参数列表对象

function A(a){console.log(arguments);
}
A(1,2,3,4,5,8);  //  [1, 2, 3, 4, 5, 8, callee: ƒ, Symbol(Symbol.iterator): ƒ]let B = (b)=>{console.log(arguments);
}
B(2,92,32,32);   // Uncaught ReferenceError: arguments is not definedlet C = (...c) => {console.log(c);
}
C(3,82,32,11323);  // [3, 82, 32, 11323]

4.this指向问题 [重点,也是难点]

  • 箭头函数不改变this指向,this为上层函数作用域的this对象,如果没有上层函数作用域,则指向顶部this(在浏览器中顶部this则是window)。普通函数的this指向该函数的调用者。
  • call, apply, bind会改变普通函数的this,但不会改变箭头函数的this
var obj = {a: 10,b: () => {console.log(this.a); // undefinedconsole.log(this); // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}},c: function() {console.log(this.a); // 10console.log(this); // {a: 10, b: ƒ, c: ƒ}}
}
obj.b();
obj.c();
var obj = {a: 10,b: function(){console.log(this.a); },c: function() {return ()=>{console.log(this.a); //此处a为10}}
}
obj.b(); //10
obj.c()();//10

箭头函数的 this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply()

let obj2 = {a: 10,b: function(n) {let f = (n) => n + this.a;return f(n);},c: function(n) {let f = (n) => n + this.a;let m = {a: 20};return f.call(m,n);}
};
console.log(obj2.b(1));  // 11
console.log(obj2.c(1)); // 11

5.箭头函数内不能用yield且不能用作Generator函数,而普通函数可以

三.箭头函数的使用

箭头函数有两种格式, 一种只包含一个表达式,没有{…} 和 return
一种包含多条语句, 这个时候{} return 就不能省略
注意:
1.函数体内只包含一个表达式 { … }和return可以省略掉。函数体内包含多条表达式 { … }和return不可以省略掉。
2.如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:x => { foo: x }
因为和函数体的{ … }有语法冲突,所以要改为:x => ({ foo: x })

js中箭头函数和普通函数区别相关推荐

  1. JS中的变量提升和函数提升

    console.log(a); var a = 1 如上面代码中可以看出,由于JS是从上到下一行行的执行,因此很多人看到这一串代码的时候,会认为由于log之前没有定义a,因此会输出underfind, ...

  2. html offsetwidth 字符串宽度,基于js中style.width与offsetWidth的区别(详解)

    作为一个初学者,经常会遇到在获取某一元素的宽度(高度.top值...)时,到底是用 style.width还是offsetWidth的疑惑. 1. 当样式写在行内的时候,如 时,用 style.wid ...

  3. JS中箭头函数和普通函数的五种区别

    区别一:this关键字的指向 在普通函数中this指向调用这个函数的对象. 在构造函数中,this指向对象的实例. 在箭头函数中,没有this关键字,但是可以捕获上下文中的this用在箭头函数内部,并 ...

  4. js 中meta 移除head_JS函数和winform函数之间的相互调用

    1.写一个简单的html页面,用于输入日志,代码如下: <html><head> <meta charset="UTF-8"> <scri ...

  5. js中变量名提升和函数名提升

    首先,js中变量没有块级作用域,但是有函数作用域,即只有函数可以约数变量的作用域. 并且,函数的实质也是一个变量,所以可以改变它的值,即赋值.所以变量名提升和函数名提升非常相像. 1.变量名的提升发生 ...

  6. js中的变量提升和函数提升——精炼版

    javaScript中用var定义变量时存在变量提升(ES6及之后的let/const定义变量时为块级作用域无变量提升,ES6之前js没有块级作用域),比如: console.log(a); // 不 ...

  7. JS中的setTimeout和setInterval函数

    目录 前言 setTimeout setTimeout()函数应用之点名器 setInterval setInterval应用之重写点名器 前言 在生活中,常有定时做某事,或者循环做某事的需求,如设置 ...

  8. js中以构造函数方式调用函数

    构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明.函数表达式或者函数构造器(见以前的随笔)等方式来构造函数对象. 要以构造函数的方式调用函数,只需 ...

  9. js中关于length与size的区别

    length与size的区别 用了很长时间的length的一直没考虑过其与size的区别,今天同事问起,特意查找资料,将两者的相同点与共同点列出来. 相同点:在jQuery中用于返回元素的个数,siz ...

最新文章

  1. 深度解读:人体防御病毒的免疫力究竟是什么?
  2. SQL学习总结-思维导图
  3. 算法导论——所有点对最短路径:稀疏图Johnson算法
  4. can bus 中spn是什么_CP AUTOSAR功能栈简介NM网络管理(Can)
  5. SQL Server 2005 Service Broker 初探 [摘抄]
  6. 大数据分析工具有哪些特性
  7. Oracle在线撤销表空间,Oracle创建、管理撤销表空间
  8. 计算机网络英语求职信范文大全,英文求职信
  9. 网络系统管理赛项之Debian七. 2021年全国职业院校技能大赛将挑选各省1人或1组队伍参赛
  10. 特征提取丨共空间模式 Common Spatial Pattern (CSP)
  11. 关于ABA问题(隔壁老王问题)
  12. [USACO06DEC]最少的硬币The Fewest Coins
  13. 微信拼车小程序无服务器,滴滴顺风车下架 拼车微信小程序笑了
  14. 人工蜂群算法(Artificial Bee Colony, ABC)MATALAB代码详细解析
  15. 脑洞文之去火星搞IT!
  16. Win7不激活会怎么样 Win7可以不用激活吗
  17. iftop命令命令详解
  18. zabbix 监控snmp 网络设备
  19. r5处理器_Intel难受了,R54500U,6核心处理器笔记本价格才3499元
  20. 创建Python Pyramid 单文件 Web 应用程序

热门文章

  1. SQLserver关键字select into 用法
  2. 通知任务通知错群检讨
  3. 笔记本开机黑屏提示:ERROR 0199:System Security-Security password retry count exceeded
  4. 十六进制的浮点数转化为十进制
  5. 30岁前如何达到年薪10万
  6. VMware 虚拟机实现硬盘扩容自由 无需格式化
  7. java numbereditor_java.lang.NumberFormatException: For input string: ${jdbc.maxActive}
  8. LeNet 网络详解
  9. window常用命令
  10. python暴力破解7z_7Z压缩包怎样解密?