不理解console.error.bind
是什么?
这里为什么要使用console.error.bind
?
db.on('error', console.error.bind(console, 'error'));
直接使用console.error('error')
输出发生了错误,不好吗?
不理解console.error.bind
是什么?
这里为什么要使用console.error.bind
?
db.on('error', console.error.bind(console, 'error'));
直接使用console.error('error')
输出发生了错误,不好吗?
缘起
在JS中,函数是非常单纯的,仅仅只是函数而已,一个函数在被调用之前,对于它来说this的指向是不知道的。
默认情况下,谁调用函数,this指向谁。
解释
也就是说,当传递函数交给别人执行的时候,对于函数来说this指向新的调用者了。
console.error(),调用error函数的时候,this指向console对象,但是你把error函数传给别的东西的时候,this也变成了别的东西。
解决
如何保证this的指向不变呢?答案就是函数的原型链上有一个bind函数,这个函数可以设置函数的this指向,并且绑定后是永久的不允许修改了的,就是不会变了,bind函数的第一个参数就是this需要指向的对象。
后话:语法糖()=>{}箭头函数
箭头函数是直接被绑定在当前this对象上的,相当于在定义完成之后直接绑定了this
()=>{}大约等价于function(){}.bind(this)
也就是说,箭头函数声明的时候,this指向是定的,以后也不会变了。
是可以啊,可是db.on的第二个参数让传的是个函数啊,又不是函数的返回值。
不过我觉得倒是这么写也可以
db.on('error', () => { console.error('error') };
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
达到的是同一个效果
但
可以作为一个函数使用