ES6-7 - 箭头函数的实质、箭头函数的使用场景

箭头函数返回对象

// 这种情况要要用(),否则会将对象的{}解释为块
const fn = (a, b) => ({a:1, b:2})

箭头函数的特点

  1. this指向由外层函数的作用域来决定,它本身没有this,不能通过call、apply、bind改变
  2. 不能作为构造函数使用
  3. 不可以使用arguments对象,该对象在函数体内不存在,可用rest代替
  4. 不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
function foo() {console.log('this', this)return (a) => {console.log('a', this.a)}
}
var obj1 = { a: 2 };
var obj2 = { a: 3 };
var bar = foo.call(obj1)
bar.call(obj2) // 2
  • 所有的内层函数都是箭头函数,都没有自己的this,它们的this其实都是最外层foo函数的this。
function foo() {return () => {return () => {return () => {console.log('id:', this.id);};};};
}var f = foo.call({id: 1}); // foo是普通函数,可以通过call改变this指向var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1

定义对象的方法

  • 定义对象的方法,且该方法内部包括this且该方法内部包括this,不应使用箭头函数定义
const p = {eat: function () {console.log('this-eat', this)},sleep: () => {console.log('this-window', this)}
}
p.eat() // p
p.sleep() // window 
  • 以下例子bind与箭头函数都能让this指向实例
    在这里插入图片描述

arguments

function foo() {const a = () => {console.log(arguments)}a()
}
foo(1, 2, 3, 4) // [1,2,3,4] 箭头函数内无arguments,取外层的
function foo() {setTimeout(() => {console.log(arguments)})
}
foo(1, 2, 3, 4) // [1,2,3,4]  箭头函数内无arguments,取外层的

嵌套的箭头函数

// 非常语义化
function insert(value) {return {into: function (array) {return {after: function (afterValue) {array.splice(array.indexOf(afterValue) + 1, 0, value);return array;}};}};
}insert(2).into([1, 3]).after(1); //[1, 2, 3]
// 改写为箭头函数,效果相同但是可读性差
let insert = (value) => ({into: (array) => ({after: (afterValue) => {array.splice(array.indexOf(afterValue) + 1, 0, value);return array;
}})});insert(2).into([1, 3]).after(1); //[1, 2, 3]

应用场景

  1. 简单的函数表达式,内部没有this引用,没有递归,事件绑定,解绑定
  2. 内层函数表达式,需要调用this,且this应与外层函数一致时(保证指向vue实例)
const sortArr = (...nums) => nums.sort((a, b) => a - b)
console.log(sortArr(5, 4, 1, 10)) // [1, 4, 5, 10]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis比hibernate处理速度快的原因

mybatis:是面向结果集的。当要展示的页面需要几个字段时,springmvc会提供这几个字段并将其拼接成结果集,在转化为相应的对象。 hibernate:是面向对象的。要展示的页面需要某些字段时,会将所有字段都查出来,在转化为相应…

zabbix 从入门到精通

https://www.cnblogs.com/clsn/p/7885990.html 转载于:https://www.cnblogs.com/learningJAVA/p/8376589.html

javasript --- 一个日期规范(x秒前,x分前...)

Time函数(通俗易懂,自己根据实际需求修改吧- -) // time.js var Time {// 获取当前时间戳getUnix: function () {var date new Date();return date.getTime();},// 获取今天0点0分0秒的时间戳getTodayUnix: function () {var date new Date();date.setHours(0);date.setMin…

ES6-8 - 函数名/对象拓展、描述符、getter/setter

函数名 有两种特殊情况:bind方法创造的函数,name属性返回bound加上原函数的名字;Function构造函数创造的函数,name属性返回anonymous。 bind函数名 // 以bound开头 function foo() { } const fnName foo.bind().name console.lo…

javascript --- 再识闭包

看下面一个例子: function zipCode(code, location) {let _code code;let _location location || ;return {code: function () {return _code;},location: function() {return _location;}} }再上述封闭的函数中,code的匿名函数根据作用域链可以访问到外面的_code变量. con…

iframe.contentWindow介绍

一、在使用iframe的页面,要操作这个iframe里面的DOM元素可以用: contentWindow、contentDocument(测试的时候chrome浏览器,要在服务器环境下) 1、先获取iframe里面的window对象,再通过这个对象,获取到里面的DOM元素 例…

ES6-9 对象密封4种方式、assign、取值函数的拷贝

一 对象密封 1 Object.preventExtensions 禁止对象拓展,仍可删除 严格模式下报错 const origin {a: 1 } const fixed Object.preventExtensions(origin) console.log(origin fixed) // true console.log(Object.isExtensible(origin)) // false 不可拓展 orig…

MySQL入门命令

我主要是在维护OpenStack云平台的时候会涉及MySQL数据库的操作,这里就跟大家分享一下常用的简单命令,也为自己做个小练习。 1.登录MySQL数据库 mysql -h localhost -u root -p 123456 其中,-h:mysql服务器的IP地址或主机名&#x…

【模板】分块

题意简述 已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 题解思路 对于一个长度为n的序列,我们可以讲其中的元素分为\( \sqrt{n} \) 个连续的子序列,每块的长度自然就为\( \sqrt{n} \)…

javascript --- 使用ajax与服务器进行通信

Ajax: (Asynchronous JavaScript and XML,异步JavaScript与XML技术)是一种有效利用JavaScript和DOM的操作. 与传统HTTP请求的区别: Ajax允许只更新页面的一部分,因此减少了响应中传输的数据量 Ajax的API: Ajax与服务器进行通信,可以使用JavaScript中原生的XMLHttpRequest对象…

ES6-10 super、4种遍历方式、原型、symbol遍历

由于现代 JavaScript 引擎优化属性访问所带来的特性的关系,更改对象的 [[Prototype]]即__proto__在各个浏览器和 JavaScript 引擎上都是一个很慢的操作。 一 Object原型方法 1 Object.setPrototypeOf(obj, proto) 用该方法而不是直接修改__proto__返回值是设置好原…

IntelliJ IDEA使用

1:下载 ideaIU-2017.2.exe,JetbrainsCrack-2.6.2.jar(补丁) 2:安装ideaIU-2017.2.exe,将补丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目录下 3:在安装的idea下面的bin目录下面有2个文件 : 一个是id…

js中如何删除json对象的某一个选项

我有一个这样一个对象,getData, 但是我不想要每一项的id,那怎么去删除呢(使用delete)? getData.map((item) >{delete item["id"];});console.log(getData);转载于:https://www.cnblogs.com/mmykdbc/p/8386407.html

ES6-11 Symbol、iterator、forOf、typeArray

…剩余运算符 const obj1 {a: 1,b: 2 } const obj2 {a: 100,b: 2,c: 300 } const obj {...obj1,...obj2 } console.log(obj) // 和Object.assign(obj, obj1, obj2)结果相同[Symbol.hasInstance] Symbol构造函数上的属性,默认调用了方法 iterator迭代器 对数…

node --- 游走在客户端和服务器间的http

本篇文章,讲述了一个很简单的上传图片(/start)到本地服务器,然后路由跳转到/upload. 写这个程序的目的是为了帮助理解HTTP的一些基本概念及node对于http api的实现以及程序的设计模式. IP: 计算机之间的通信 TCP: 应用程序之间的通信 HTTP: 基于TCP实现的应用层协议,设计之初是…

BigDecimal踩过的大坑

通常Java中涉及金钱相关的计算为了保持精度,会采用BigDecimal来实现,但是BigDecimal中创建BigDecimal类对象的时候,如果使用直接new的话,必须是String类型的参数,否则会导致创建出来的对象不是你想要的,比如…

redis配置环境变量

直接上图不解释 redis安装路径,我的电脑右击属性 窗口R键,输入cmd回车,输入redis-server.exe 回车 再开一个命令窗口,窗口R键,输入cmd回车,输入 redis-cli.exe -h 127.0.0.1 -p 6379 回车 转载于:https:/…

对转义字符的思考

ASCII码 计算机存储文字时用的是二进制,ASCII码就是一张对照表,什么字符对应什么码,将二进制码存储下来0-127位表示基础的ASCII码0-31,和127表示非打印控制字符(如换行、回车、响铃、文头、文尾)32-126表示…

进程总结

进程总结 进程: 正在进行的一个过程或者说一个任务 进程是计算机中资源分配的最小单位 多进程之间的数据是隔离的 多进程是用来解决高计算型的程序用的 启动进程的开销比较大,其开启数量和cpu的个数相关,正常在cpu的个数1-2倍之间 进程越多&a…

debian如何安装Let's Encrypt

如果python默认版本不是2,删除 /usr/bin/python 添加软引用 in -s /usr/bin/python2 /usr/bin/python 第一步,卸载virtualenv apt-get purge python-virtualenv python3-virtualenv virtualenv 如果pip没有就安装pip apt-get install python-pip pip …