为什么将`this`分配给`self`并运行`self.method()`?

时间:2012-05-14 09:48:41

标签: javascript

我正在阅读mongoose

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

我不明白为什么作者会将this分配给self并运行self.doQueue()。为什么不跑:

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

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

5 个答案:

答案 0 :(得分:14)

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

使用meself有点确保使用this的正确上下文,因为在JavaScript中,this的范围是变体。例如,如果您的类中有一个事件触发一个函数,this将会不同,并且不会是您的函数对象,而是调用该函数的对象。要解决此问题,通常会使用meself来确保他们引用正确的对象... this,就像在实际对象中一样。

答案 1 :(得分:3)

只是为了让@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();
  } 
 };

答案 2 :(得分:2)

您通常这样做的唯一原因是,对doQueue()的调用是在一个块内,该块会更改this的值,例如另一个函数。

在这种情况下,它不会用于任何目的,可能是旧代码的残余,但未被更改。

答案 3 :(得分:2)

开发人员很可能需要一致性,但未能这样做

否则,您将在某些函数中使用this,在其他函数中使用self,在其他函数中使用a mix of both,具体取决于您使用对象的位置以及是否使用嵌套函数/回调。

通过always assigning this to self然后使用后者,您在每个函数的最开始处都有一个额外的赋值,但总是使用self来访问该对象。

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

答案 4 :(得分:-2)

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