Javascript 范围基础知识:.bind 或 self =this?

Javascript scope basics : .bind or self =this?

对我来说,下面的代码做同样的事情,但我不完全确定所以我想确定一下:

var self = this;
this.param = 5;
var listener = sub.on('change', function() {
     self.param = 10;
});

是否与?:

相同
this.param = 5;
var listener = sub.on('change', function() {
     this.param = 10;
}.bind(this));

它们并不相同,但出于您在您发布的示例中的目的,它们足够接近,您可以获得相同的效果。目标是稍后在实际调用处理程序时引用 this 外部 事件处理程序的值。这两种选择都有这种效果。

.bind() 函数还做了一些其他事情,这些事情在像这样的简单情况下不会产生任何影响。

编辑 — 并且一定要注意@deceze 在他的回答中发布的修复。

下面是两者不同的示例:如果 self 变量发生变化,那么您的事件处理程序的行为就会不同。您可能不太可能更改它,但有可能(可能会引入错误)。使用.bind(),您将获得一个真正无法更改的功能;没有什么可以覆盖您以这种方式设置的绑定。

应该是:

sub.on('change', function() {
     this.param = 10;
}.bind(this))
            ^
 misplaced parenthesis

您想为回调函数绑定 this,而不是 on()。如果您修复该问题,结果将与您的目的相同。

还请考虑这两种(实际上是 3 种)方式都有显着的性能结果。

查看 https://jsperf.com/bind-vs-self-closure/17

做闭包引用似乎比绑定上下文快得多(实际上是 100 倍)。