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

求详解该代码asyncify,代码来自《你不知道的Javascript》

[复制链接]
  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2021-12-8 09:22:15 | 显示全部楼层 | 阅读模式
    悬赏1油猫币未解决
    code.png

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5961

    回帖

    6760

    积分

    管理员

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

    积分
    6760

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

    发表于 2021-12-8 10:58:04 | 显示全部楼层
    坐等大佬
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2021-12-8 12:13:20 | 显示全部楼层
    难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决很多问题。
    1. [this].concat([].slice.call(arguments))
    复制代码
    应用ES6解构赋值的特性可以写成
    1. [this, ...arguments]
    复制代码
    ,所以那句代码等效于
    1. fn = orig_fn.bind.apply(orig_fn, [this, ...arguments]);
    复制代码
    等效于
    1. fn = orig_fn.bind(this, ...arguments);
    复制代码
    ,这里就可以看出,apply的作用是将arguments数组转换为多个单独的参数,即所谓的柯里化。其他代码不难理解,其实我觉得他这种将fn置为null然后用orig_fn来调用的做法有点故弄玄虚(说难听点,叫脱裤子放屁),当然也可能是我理解有问题,我觉得asyncify完全可以写成这样:
    1. function asyncify(fn) {
    2.     return function() {setTimeout(fn, 0)};
    3. }
    复制代码
    已有2人评分好评 油猫币 理由
    王一之 + 1 + 2 ggnb!
    陈公子的话 + 1 赞一个!

    查看全部评分 总评分:好评 +1  油猫币 +3 

    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    昨天 08:59
  • 签到天数: 532 天

    [LV.9]以坛为家II

    148

    主题

    420

    回帖

    1215

    积分

    版主

    积分
    1215

    油中2周年生态建设者

    发表于 2021-12-8 12:25:58 | 显示全部楼层
    cxxjackie 发表于 2021-12-8 12:13
    难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...

    太强了
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

  • TA的每日心情

    2024-1-3 11:32
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    108

    主题

    101

    回帖

    431

    积分

    高级工程师

    积分
    431

    油中2周年油中3周年

    发表于 2021-12-8 14:06:42 来自手机  | 显示全部楼层
    cxxjackie 发表于 2021-12-8 12:13
    难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...

    ggnb!!!      
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2021-12-8 14:41:07 | 显示全部楼层
    ggnb!!!!!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 879 天

    [LV.10]以坛为家III

    30

    主题

    732

    回帖

    7356

    积分

    荣誉开发者

    精通各种语言的HelloWord!

    积分
    7356

    荣誉开发者油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2021-12-8 20:27:06 来自手机  | 显示全部楼层
    cxxjackie 发表于 2021-12-8 12:13
    难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...

    学习了学习了ggnb
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2021-12-8 20:31:04 | 显示全部楼层
    cxxjackie 发表于 2021-12-8 12:13
    难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...

    我又想了一下,他这种写法是为了传参,上面的例子中result函数不需要参数,但实际使用中可能会有需要传参的情况,像这样:
    1. asyncify(result)(1, 2, 3);
    复制代码

    用bind可以确保将参数传递给result,asyncify可以改写成这样:
    1. function asyncify(fn) {
    2.     return function() {
    3.         var _fn = fn.bind(this, ...arguments);
    4.         setTimeout(_fn, 0);
    5.     };
    6. }
    复制代码
    回复

    使用道具 举报

    发表回复

    本版积分规则

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