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

时间:2015-09-16 13:40:19

标签: javascript scope bind

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

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));

3 个答案:

答案 0 :(得分:2)

他们不是相同的,但是为了您的目的,您发布的内容非常接近,因为您可以获得相同的效果。目标是在实际调用处理程序后,在事件处理程序之外引用this 外部的值。这两种选择都有这种效果。

.bind()函数做了一些其他的事情,在这样的简单情况下不会有任何区别。

编辑 - 并且肯定会注意到@deceze在他的回答中发布的修复。

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

答案 1 :(得分:1)

应该是:

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

您希望为回调函数绑定this,而不是on()。如果您解决了这个问题,结果将与您的目的相同。

答案 2 :(得分:1)

请同时考虑两种方式(实际上是3种方式)都有显着的效果。

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

执行封闭引用似乎比绑定上下文更快(实际上是100倍)。