rubinTime 发表于 2021-12-8 09:22:15

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

李恒道 发表于 2021-12-8 10:58:04

坐等大佬

cxxjackie 发表于 2021-12-8 12:13:20

难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决很多问题。.concat([].slice.call(arguments))应用ES6解构赋值的特性可以写成,所以那句代码等效于fn = orig_fn.bind.apply(orig_fn, );等效于fn = orig_fn.bind(this, ...arguments);,这里就可以看出,apply的作用是将arguments数组转换为多个单独的参数,即所谓的柯里化。其他代码不难理解,其实我觉得他这种将fn置为null然后用orig_fn来调用的做法有点故弄玄虚(说难听点,叫脱裤子放屁),当然也可能是我理解有问题,我觉得asyncify完全可以写成这样:
function asyncify(fn) {
    return function() {setTimeout(fn, 0)};
}

陈公子的话 发表于 2021-12-8 12:25:58

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

太强了

国家电网0 发表于 2021-12-8 14:06:42

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

ggnb!!!      

rubinTime 发表于 2021-12-8 14:41:07

ggnb!!!!!!

Ne-21 发表于 2021-12-8 20:27:06

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

学习了学习了ggnb

cxxjackie 发表于 2021-12-8 20:31:04

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

我又想了一下,他这种写法是为了传参,上面的例子中result函数不需要参数,但实际使用中可能会有需要传参的情况,像这样:
asyncify(result)(1, 2, 3);
用bind可以确保将参数传递给result,asyncify可以改写成这样:
function asyncify(fn) {
    return function() {
      var _fn = fn.bind(this, ...arguments);
      setTimeout(_fn, 0);
    };
}
页: [1]
查看完整版本: 求详解该代码asyncify,代码来自《你不知道的Javascript》