为什么我必须在lambda中包装console.error?

时间:2018-03-09 16:03:54

标签: javascript binding

考虑这两个脚本:

a.js

const main = async () => {
  throw new Error('DESTROY ALL HUMANS');
};

main().catch(error => console.error(error));

b.js

const main = async () => {
  throw new Error('DESTROY ALL HUMANS');
};

main().catch(console.error);

a.js 使用lambda但 b.js 直接传递console.error

我在某处看到 b.js 可能需要console.error.bind(console)。但是,当我运行它们时,它们都表现出相同的行为。

这两者的行为有何不同?

1 个答案:

答案 0 :(得分:1)

如果您还没有,请阅读documentation on MDN about this topic。它非常彻底。 .catch是包含对obj.then(undefined, onRejected)的调用的语法糖。

  

onRejected   在承诺被拒绝时调用Function。这个函数有一个参数:reason - 拒绝原因。

除此之外,我会调查callbacksconsole.error本身并不需要包含在函数中 - 只是在Promise-rejection案例中使用它。

对于b.js,您发现自己可以将console.log函数作为first-class object传递,而.catch将知道如何对待它,即执行它以响应reason中传递的拒绝(这是a.js明确定义的内容)。