以下来文字来自阮大神所著书籍摘记。为了加深记忆。本人就手动敲了一遍(相关代码本人也执行过,可保证运行通过.)

箭头函数注意事项:

1) 函数体内的this对象就是定义时所在的对象,而不是使用时所在的对象。

2) 不可以当做构造函数。也就是说,不可以使用new命令,否则会抛出错误。

3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。

关于什么是arguments对象。可以参考MDN链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

4) 不可以使用yield命令,因此箭头函数不能用作Generator函数。

其中,第一点尤其值得注意,this对象的指向是可变的,但在箭头函数中它是固定的。

下面有几个例子体会一下箭头函数的使用:

  • function foo(){
    setTimeout(()=>
    {
    console.log('id:',this.id);
    },100);
    } var id=21;
    foo.call({id:42}) //输出42

    setTimeout的参数是一个箭头函数,这个箭头函数的定义是在foo函数生成时生效的,真正执行要到100ms秒以后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21.但是箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id:42}),所以输出的是42.

  • 箭头函数可以让this指向固定化,这种特性非常有利于封装回调函数。例如以下的例子。DOM事件的回调函数封装在一个对象里面。
    var handler={
    id:'123456',
    init:function()
    {
    document.addEventListener('click',
    event=>this.doSomething(event.type,false);
    },
    doSomething:function(type)
    {
    console.log('Handling '+type+' for'+this.id);
    }
    }

    以上代码的init方法中使用了箭头函数,这导致箭头函数里边的this总是指向handler对象。

  • function foo()
    {
    return ()=>
    {
    return ()=>
    {
    return ()=>
    {
    console.log('id:',this.id);
    }
    }
    }
    }
    var f=foo.call({id:1});
    var t1=f.call({id:2})()();
    var t2=f().call({id:3})();
    var t3=f()().call({id:4})

    上面的代码只有一个this,就是函数foo的this,所以t1,t2,t3都输出同样的结果。因为所有的内层函数都是箭头函数。都没有自己的this,它们的this其实都是最外层foo函数的this.

  • 除了this,以下3个变量在箭头函数中也是不存在的,分别指向外城函数对应的变量:arguments、super和new.target.
    function foo()
    {
    setTimeout(()=>
    {
    console.log('args:',arguments)
    },100)
    }
    foo(2,4,6,8)

    上面的代码中,箭头函数内部的变量arguments其实是函数foo的arguments变量。

  • 另外由于箭头函数没有自己的this,当然也就不能用call()、apply()、bind()这些方法去改变this的指向。
    (function()
    {
    return [
    console.log((()=>this.x).bind({x:'inner'})())
    ]
    }).call({x:'outer'});
    //输出['outer']

    上面的代码中,箭头函数没有自己的this,所以bind方法无效,内部的this指向外部的this.

ES6箭头函数-2的更多相关文章

  1. es6箭头函数讲解

    es6箭头函数的用法 箭头函数是es6的一种函数的简写方法. 如下: var f = v = > v; //等同于 var f = function(v){ return v; } var su ...

  2. es6箭头函数 this 指向问题

    es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){ ...

  3. ES6 — 箭头函数

    一 为什么要有箭头函数 我们在日常开发中,可能会需要写类似下面的代码 const Person = { 'name': 'little bear', 'age': 18, 'sayHello': fu ...

  4. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  5. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  6. ES6 箭头函数(Arrow Functions)

    ES6 箭头函数(Arrow Functions) ES6 可以使用 "箭头"(=>)定义函数,注意是函数,不要使用这种方式定义类(构造器). 一.语法 具有一个参数的简单函 ...

  7. ES6箭头函数基本用法

    ES6箭头函数基本用法 ``` window.onload = function(){ alert(abc); } //箭头函数 window.onload = ()=>{ alert(&quo ...

  8. ES6 箭头函数this指向问题

    var name = "window"; var person1 = { name: "person1", show1: function() { consol ...

  9. Vue ES6箭头函数使用总结

    Vue ES6箭头函数使用总结   by:授客 QQ:1033553122   箭头函数 ES6允许使用“箭头”(=>)定义函数: 函数不带参数 定义方法:函数名称 = () => 函数体 ...

  10. ES6 -箭头函数 ,对象的函数解构

    ES6 -箭头函数: //es6 中的箭头函数和扩展 //es5的写法 // function add(a,b){ // return a + b; // } // add(1,2); //3 fun ...

随机推荐

  1. C#中获取多个对象list中对象共有的属性项

    场景 有一组数据list<TestDataList> 每一个TestDataList是一个对象,此对象可能有温度数据,也可能没有温度数据. 有温度数据的情况下,温度数据属性又是一个list ...

  2. Inherit from the Business Class Library Class 继承自Business类(EF)

    In this lesson, you will learn how to implement business classes for your application using the Busi ...

  3. PHP intdiv 数学函数

    定义和用法 intdiv - 对除法结果取整 版本支持 PHP4 PHP5 PHP7 不支持 不支持 支持 语法 intdiv ( int $dividend , int $divisor ) int ...

  4. Html5 Canvas动画基础碰撞检测的实现

    在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS.Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部运行机制吗?下面将针对基本的碰撞检测技术 ...

  5. JS基础语法---arguments对象伪数组

    引入: //计算两个数字的和 function f1(x, y) { return x + y; } //计算三个数字的和 function f2(x, y, z) { return x + y + ...

  6. 为什么AlertDialog要使用Builder来构建呢

    为什么 AlertDialog 使用Builder 模式呢? 首先说句废话,因为 AlertDialog 太过复杂,内部参数太多,然后不使用构建者模式那么 AlertDialog 的构造方法就可能是: ...

  7. 【Android】Android多渠道打包--Gradle打包

    Android多渠道打包--Gradle打包 前言 由于App一般都会在多个应用市场上架,为了分析App在每个不同渠道的具体的数据,一般都会对不同渠道打包不同的App.多渠道打包有多种方式,这里只介绍 ...

  8. Spring 事务 属性 详细

    学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性. 传播属性 传播属性定义的是当一个事务方法碰到另一个事 ...

  9. 小程序登录解密用户数据encryptedData -41001: encodingAesKey 非法

    问题: 做小程序微信授权登录,先获取code,然后去获取到session_key和open_id,再拿到encryptedData,传到服务器去解密拿到用户信息,但是有时成功,有时返回-41001错误 ...

  10. Linux系统学习 一、安装,调试

    环境 主机: Windows 10 虚拟机: VMware 15 Pro 镜像: 一.安装过程: 然后开启虚拟机 设置主机名 时区 密码 最小安装 等着 重启 登录 二.配置静态IP地址 输入ifco ...