当前位置: 首页 > news >正文

ES6指北【2】—— 箭头函数

1.箭头函数基本语法

1.1 ES3 函数语法

// 具名函数
function xxx(arg1, arg2) {
    console.log(arg1)
    console.log(arg2)
    return arguments
}

// 匿名函数(三句话)
let xxx = function (arg1, arg2) {
    console.log(arg1)
    console.log(arg2)
    return arguments
}

// 第一句话 声明xxx
// 第二句话 声明匿名函数
// 第三句话 把匿名函数赋值给xxx

1.2 箭头函数语法

特点: 只能做赋值,不能做声明
    第一种写法【完全写法 —— 不省略参数个数,不省略函数体花括号】
    1.参数个数 >= 2
    2.函数体内语句个数 >= 2

    let xxx = (arg1, arg2) => {
        console.log(arg1)
        console.log(arg2)
        return arg1 + arg2
    }
    第二种写法【省略参数括号】
    1.参数只有一个
    2.函数体内语句个数 >= 2
    let xxx = arg1 => {
        console.log(arg1)
        return arg1
    }
    第三种写法【省略函数花括号和return】
    1.参数个数 >= 2
    2.函数体内语句只有一句,且这一句会被return
    let xxx = (arg1, arg2) => arg1 + arg2
    // 如果你加了花括号,就必须把return同时加上去才能够返回arguments
    let xxx = (arg1, arg2) => {
        return arg1 + arg2
    }

2.为了搞定难搞的this,我们搞出了箭头函数

ES3 支持 this,关于this在ES3中的使用
请看this总结【1】—— this概览和this总结【2】—— call/apply和bind
ES6 的箭头函数弱化了this的用法

2.1 箭头函数不绑定this

    在ES3里,this是Function隐藏的第一个参数
    而且this是什么,是不确定的,因为每个被新定义的函数都会创建自己的this值

    function Person() {
        // Person() 构造函数定义 `this`作为它自己的实例.
        this.age = 0;

        setInterval(function growUp() {
            // 在非严格模式, growUp()函数定义 `this`作为全局对象,
            // 与在 Person()构造函数中定义的 `this`并不相同.
            this.age++;
        }, 1000);
    }

    let p = new Person();

    不同函数里的this可能总是不一样,而且没有什么规律和逻辑,很难使用
    因此,我们在调用函数的时候,高级写法就是使用call
    这样,我们在代码未执行前就能确定this的值是什么

    function xxx(/*this,*/arg1, arg2) {
        console.log(this, arg1, arg2)
    }

    xxx.call(window, 1, 2) // Window 1 2
箭头函数里的this不会被call改变
    let test1 = () => {
        console.log(this)
    }
    test1.call({name: 'bruce'}) // window

2.2 如何使用箭头函数里的this

划重点:把箭头函数里的this当做普通变量看待!!!!
划重点:把箭头函数里的this当做普通变量看待!!!!
划重点:把箭头函数里的this当做普通变量看待!!!!

    function Person() {
        this.age = 0;
        let a = 0
        setInterval(() => {
            console.log(a) // 请问a去哪儿找?Person的作用域
            this.age++; // 请问this去哪儿找?Person的作用域
            // 这样,|this| 就能正确地指向person对象,你也再也不用管call的第一个参数到底传的是啥了
        }, 1000);
    }

    let p = new Person();

3.使用箭头函数使得代码变得简洁

一般用于回调函数

// 把数组内每一个数都换做其平方数
// 然后再将每个数都减2
// 【使用map方法】
// 请问该怎么写??

// ES3写法
let arr = [1, 3, 4, 6, 7]
arr.map(function (number) {
    return number * number
}).map(function (number) {
    return number - 2
})

// ES6写法
arr.map(number => number * number).map(number => number - 2)

4.ES6Function作为方法时的简写

    let obj = {
        console: function (a) {
            console.log(a)
        }
    }
    // 等价于
    let obj = {
        console(a) { // 删去了冒号和function关键字
            console.log(a)
        }
    }

5.箭头函数其它知识【抄mdn的】

5.1箭头函数没有arguments

    let arrow = p1 => {
        console.log(arguments) // 报错:arguments is not defined
    }
    arrow('xxx')

5.2箭头函数不可作为构造函数且没有prototype属性

    let Foo = () => 'test'
    let f1 = new Foo() // 报错:Foo is not a constructor
    console.log(Foo.prototype) // undefined

相关文章:

  • MyBatis + winform 配置
  • VS2015 中统计整个项目的代码行数
  • EI收录中国大陆期刊名录(2012年)
  • 2018/02/28
  • 路由反射器(Route Reflector)简介
  • 最优化原理,凸优化
  • Windows7+vs2008进行wince开发的环境配置
  • 太难、太贵、太耗时......这些都是你对CRM工具的误解!
  • 百度搜索结果的URL参数关键词(wd|word|kw|keyword)
  • delay的几个函数说明
  • 定制Android ListView 快速滚动的滚动条-fast scroll bar thumb
  • VR混战已开始,看各大虚拟现实如何争春?
  • java9 gc log参数迁移
  • NSURL
  • MySQL数据库----流程控制
  • 30天自制操作系统-2
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Cumulo 的 ClojureScript 模块已经成型
  • input实现文字超出省略号功能
  • Intervention/image 图片处理扩展包的安装和使用
  • iOS 颜色设置看我就够了
  • JavaScript-Array类型
  • React组件设计模式(一)
  • spring-boot List转Page
  • TCP拥塞控制
  • 阿里云Kubernetes容器服务上体验Knative
  • 闭包--闭包之tab栏切换(四)
  • 第2章 网络文档
  • 诡异!React stopPropagation失灵
  • 那些年我们用过的显示性能指标
  • 巧用 TypeScript (一)
  • 微信小程序开发问题汇总
  • 回归生活:清理微信公众号
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (附源码)ssm高校实验室 毕业设计 800008
  • (一) storm的集群安装与配置
  • (转)Linq学习笔记
  • .cfg\.dat\.mak(持续补充)
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net下的富文本编辑器FCKeditor的配置方法
  • .pop ----remove 删除
  • /boot 内存空间不够
  • @SpringBootApplication 包含的三个注解及其含义
  • [<死锁专题>]
  • [1]-基于图搜索的路径规划基础
  • [20190401]关于semtimedop函数调用.txt
  • [android] 手机卫士黑名单功能(ListView优化)
  • [CF494C]Helping People
  • [Design Pattern] 工厂方法模式
  • [ffmpeg] aac 音频编码
  • [FZSZOJ 1223] 上海红茶馆
  • [java/jdbc]插入数据时获取自增长主键的值
  • [Linux打怪升级之路]-vim编辑器(看就能马上操作噢)