求详解该代码asyncify,代码来自《你不知道的Javascript》
坐等大佬 难点应该在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)};
} cxxjackie 发表于 2021-12-8 12:13
难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...
太强了 cxxjackie 发表于 2021-12-8 12:13
难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...
ggnb!!! ggnb!!!!!! cxxjackie 发表于 2021-12-8 12:13
难点应该在orig_fn.bind.apply这句,其实这些乱七八糟的语法是ES6之前的东西,ES6带来的新特性可以帮助解决 ...
学习了学习了ggnb 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]