上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
12下一页
返回列表 发新帖

ts对象中的箭头函数this指向哪里?

[复制链接]
  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-2-2 17:51:01 | 显示全部楼层 | 阅读模式
    悬赏5油猫币未解决

    本帖最后由 bigonion 于 2023-2-3 15:15 编辑

    本帖最后由 bigonion 于 2023-2-2 17:52 编辑

    ts对象中的箭头函数this指向哪里?

    我们先来一个对象

    let human:{name:string,age:number,sayHi:()=>void}={
      name:"superman",
      age:18,
      sayHi:function(){console.log(`Hi,I'm ${this.name}, I'm ${this.age} years old`);}
    }
    human.sayHi()

    这样去调用human的sayHi方法自然是没问题的,这里this指向的是调用方法的对象:human
    但是我发现如果把function改成箭头函数,居然不行,像这样

    let human:{name:string,age:number,sayHi:()=>void}={
      name:"superman",
      age:18,
      sayHi:()=>{console.log(`Hi,I'm ${this.name}, I'm ${this.age} years old`);}
    }
    human.sayHi()

    是会报错的
    image.png
    这是什么情况,箭头函数中的this到底指向哪里?

    解决篇

    感谢:CrazyTaylor,道哥,一之哥哥,wwwwwllllk的帮助

    this在箭头函数里就和最外层的this没啥两样的,即浏览器里指的就是window

    function里面的this指向调用方法的对象

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6078

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-2-2 18:06:06 | 显示全部楼层
    因为箭头函数取的是当前的函数作用域,对象类型不具备函数作用域
    具体例子可以看
    https://bbs.tampermonkey.net.cn/ ... wthread&tid=720
    那我们为什么不直接写成
    var cat={
      name:'哆来A梦',
      eat:()=>{
      console.log(this.name+'正在吃东西')
    }
    }
    setInterval(cat.eat,3000)

    反而要在多一层function呢?

    因为箭头函数会获取到所处对象的所在的作用域,也就是windows,那this.name就变成了获取window下的name变量内容了,所以我们才需要使用一层function来保留住箭头函数所处的作用域,这点大家刚开始接触可能难以适应,不如我们简化一下:箭头函数会继承function的this作用域,大部分的时候理解都不会出现太大的问题,如果出现超出你意外的情况就请查阅资料啦!
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-2-2 18:17:49 | 显示全部楼层
    李恒道 发表于 2023-2-2 18:06
    因为箭头函数取的是当前的函数作用域,对象类型不具备函数作用域
    具体例子可以看
    https://bbs.tampermonkey ...

    真的好混乱
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-11-2 17:37
  • 签到天数: 275 天

    [LV.8]以坛为家I

    114

    主题

    452

    回帖

    973

    积分

    荣誉开发者

    积分
    973

    荣誉开发者油中2周年卓越贡献生态建设者

    发表于 2023-2-2 18:19:47 | 显示全部楼层
    打印一下this,打印出来指向哪里就是哪里。然后就不用纠结了,解决了问题就行了
    接脚本定制
    I frequently record, because want to leave something.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6078

    荣誉开发者管理员油中2周年生态建设者喜迎中秋

    发表于 2023-2-2 18:45:33 | 显示全部楼层

    开心点吧
    目前问的都是可以在mdn和语法手册上翻到相关特性
    学到中期啥资料都没有了
    全靠硬读源码和相关实现
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-2-2 22:39:36 | 显示全部楼层
    李恒道 发表于 2023-2-2 18:45
    开心点吧
    目前问的都是可以在mdn和语法手册上翻到相关特性
    学到中期啥资料都没有了

    确实





    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    36

    回帖

    29

    积分

    助理工程师

    积分
    29

    新人报道油中2周年

    发表于 2023-2-3 09:28:45 | 显示全部楼层
    普通函数this指向当前对象,箭头函数指向window

    点评

    这个应该是对的  发表于 2023-2-3 15:12
    本人男,爱好女,头像是ins上的网图!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    294

    主题

    3906

    回帖

    3826

    积分

    管理员

    积分
    3826

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-2-3 09:36:12 | 显示全部楼层
    wwwwwllllk 发表于 2023-2-2 18:19
    打印一下this,打印出来指向哪里就是哪里。然后就不用纠结了,解决了问题就行了 ...

    也是一个办法,但是有时候遇到了,还是得知道为什么,不然迷茫好久
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-13 10:14
  • 签到天数: 211 天

    [LV.7]常住居民III

    294

    主题

    3906

    回帖

    3826

    积分

    管理员

    积分
    3826

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-2-3 09:52:41 | 显示全部楼层

    我平常的理解是箭头函数的this就往上推一层,例如下面这样

    // ==UserScript==
    // @name         New Userscript
    // @namespace    https://bbs.tampermonkey.net.cn/
    // @version      0.1.0
    // @description  try to take over the world!
    // @author       You
    // @match        https://bbs.tampermonkey.net.cn/thread-4061-1-1.html
    // ==/UserScript==
    
    this.name = "上一层˝";
    this.age = 188;
    
    let human = {
        name: "superman",
        age: 18,
        sayHi: () => { console.log(`Hi,I'm ${this.name}, I'm ${this.age} years old`); }
    }
    human.sayHi()

    如果有多个箭头函数,就推到最顶层

    // ==UserScript==
    // @name         New Userscript
    // @namespace    https://bbs.tampermonkey.net.cn/
    // @version      0.1.0
    // @description  try to take over the world!
    // @author       You
    // @match        https://bbs.tampermonkey.net.cn/thread-4061-1-1.html
    // ==/UserScript==
    
    this.name = "上一层˝";
    this.age = 188;
    
    let func = () => {
        let human = {
            name: "superman",
            age: 18,
            sayHi: () => { console.log(`Hi,I'm ${this.name}, I'm ${this.age} years old`); }
        }
        human.sayHi()
    }
    
    func();

    这么去理解可能有点暴力,但我觉得也不用太过于纠结,设计如此,就像世界的物理法则一样

    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。/ 微信公众号:一之哥哥
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-2-3 15:12:07 | 显示全部楼层
    王一之 发表于 2023-2-3 09:52
    [md]我平常的理解是箭头函数的this就往上推一层,例如下面这样

    ```js

    好像箭头的this就是最外层的this
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表