箭头函数中this.的使用方法问题

廖雪峰大大的网站学习JS,其中的箭头函数篇章遇到了关于this的使用问题。

廖大的文中是这么说:
由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:


var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = function () {
            return new Date().getFullYear() - this.birth; // this指向window或undefined
        };
        return fn();
    }
};

现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj:

var obj = {
  birth: 1990,
  getAge: function () {
      var b = this.birth; // 1990
      var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
      return fn();
  }
};
obj.getAge(); // 25

下面有个一同学评论,贴了以下代码:

var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
    toJSON:  () => ({'Name': this.name,'Age': this.age});
};

我尝试运行了一下,运行结果不对,没有获取到this.name和this.age。

另外下面一个同学总结的很好,我直接贴上来,作为笔记:

//用"只想安安静静码"的方法在对象中使用箭头函数:
    var xiaoming_1 = {
        name: '小明',
        age: 14,
        gender: true,
        height: 1.65,
        grade: null,
        'middle-school': '\"W3C\" Middle School',
        skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
        toJSON:  function(){
            var fn=()=>({'Name': this.name,'Age': this.age})  // 将箭头函数放置于一个方法内
            return fn()
        }
    };
    xiaoming_1.toJSON()  // Object {Name: "小明", Age: 14}
//而用"创新ZCS"的方法, 直接将箭头函数作为对象方法,将得不到对象的this.name跟this.age, 而是得到windows的name和age:
    var xiaoming_2 = {
        name: '小明',
        age: 14,
        gender: true,
        height: 1.65,
        grade: null,
        'middle-school': '\"W3C\" Middle School',
        skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
        toJSON:  ()=>({'Name': this.name,'Age': this.age})
    };
    xiaoming_2.toJSON() // Object {Name: "list", Age: undefined}  正好我的windows有个名为name的属性值为"list"
//有趣的是如果将匿名函数直接作为对象的方法, 则this的指向却是正确的:
    var xiaoming_3 = {
        name: '小明',
        age: 14,
        gender: true,
        height: 1.65,
        grade: null,
        'middle-school': '\"W3C\" Middle School',
        skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
        toJSON:  function () { return {'Name':this.name,'Age': this.age}}
    };
    xiaoming_3.toJSON()   // Object {Name: "小明", Age: 14}

原因我认为就是箭头函数的this会按照词法作用域绑定, 也就是指向外层调用者. (注意, 普通的定义在对象方法或内部方法中的内部函数的this就没有这个特点)
如果在全局环境下调用一个对象的一个由箭头函数实现的方法, 则这个箭头函数的外层调用者是windows, 箭头函数的this指向windows对象. 如xiaoming_2
如果调用箭头函数的是一个对象的方法, 则这个箭头函数的外层调用者是拥有该方法的对象, 箭头函数的this指向该对象. 如xiaoming_1
可以粗暴理解成"箭头函数在哪儿被调用, 箭头函数的this就指向哪儿"
而xiaoming_3中方法toJSON的实现就是个匿名函数, 也就是一个普通的内部函数, 它其中的this和一般内部函数中的this没有什么不同, 只要用obj.xxx形式访问这个方法, 匿名方法中的this指向的就是obj

我想表达表达不出来,其实大体的体会也是这个意思,借用他的表述。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • 与其他语言相比,函数的this关键字在JavaScript中的表现略有不同,此外,在严格模式和非严格模式之间也会有...
    codingC阅读 572评论 0 0
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 3,372评论 0 1
  • 函数函数定义与调用变量作用域全局变量方法高阶函数闭包箭头函数$generator$ 函数 函数定义与调用 定义函数...
    染微言阅读 583评论 0 5
  • 本文是大神廖雪峰的JavaScript教程学习笔记。并不是教程,如有需要,请前往廖雪峰大神大博客. 一、函数定义和...
    0o冻僵的企鹅o0阅读 486评论 1 3
  • 首先声明,我不是一个职业写手,从来没有自信有那么好的文采和想象力,只是一个生活在大家身边的一个普通的上班族。...
    火山哥2阅读 273评论 0 2