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 倍)。
对我来说,下面的代码做同样的事情,但我不完全确定所以我想确定一下:
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 倍)。