14

我正在阅读来自猫鼬的源代码

Collection.prototype.onOpen = function () {
  var self = this;
  this.buffer = false;
  self.doQueue();
};

我不明白为什么作者分配thisself并运行self.doQueue(). 为什么不直接运行:

this.buffer = false;
this.doQueue();

我是 javascript 新手,感谢您的帮助。

4

5 回答 5

18

你是对的,在这种情况下,他们可以简单地使用this.

使用meorself有点小技巧,以确保使用正确的上下文this,因为在 JavaScript 中,范围this是变体。例如,如果您有一个事件在您的类中触发一个函数,this那将是不同的,并且不会是您包含该函数的对象,而是调用该函数的对象。为了解决这个问题,人们经常使用meself确保他们指的是正确的对象... this,就像在实际对象中一样。

于 2012-05-14T09:52:35.850 回答
4

只是为了让@richard 前面说的更清楚,

Collection.prototype.onOpen = function () {
  var self = this;
  this.buffer = false;
  this.onclick = function(){
     //do some other operations here
     //if you refer `this` here then, `this` will refer to present function not the above. so to make sure it is referring to exact object people pass this to `me` or `self`   
     self.doQueue();
  } 
 };
于 2012-05-14T10:03:57.250 回答
2

您通常这样做的唯一原因是,如果调用doQueue()位于将更改this诸如另一个函数之类的值的块内。

但是在这种情况下,它没有任何用途,并且可能是未改回的旧代码的残余。

于 2012-05-14T09:54:04.120 回答
2

开发人员很可能想要一致性,但未能如愿

否则,您将this在某些函数、self其他函数中使用以及在其他函数中同时使用这两种函数,具体取决于您使用对象的位置以及是否使用嵌套函数/回调。

通过总是分配thisself后者然后使用后者,您在每个函数的一开始就有一个额外的分配,但您总是使用它self来访问对象。

但是,开发人员在您发布的代码中所做的事情并没有多大意义。他应该使用selfthis两次,而不是甚至没有必要的混合。

于 2012-05-14T09:54:56.457 回答
-2

self 是 'this' 的副本,但它总是引用正确的对象,而 'this' 可能不会。

于 2012-05-14T09:53:08.377 回答