Подтвердить что ты не робот

Зачем присваивать `this`` self` и запускать `self.method()`?

Я читаю источник из mongoose

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

Я не понимаю, почему автор присваивает this self и запускает self.doQueue(). Почему бы просто не запустить:

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

Я новичок в javascript, спасибо за помощь.

4b9b3361

Ответ 1

Вы правы, в этом случае они могли просто использовать this.

Использование me или self является небольшим взломом для обеспечения правильного контекста this, так как внутри JavaScript область this является вариантом. Если, например, у вас есть событие, запускающее функцию внутри вашего класса, this будет отличаться и не будет вашим объектом, в котором находится функция, а вместо этого объект, который вызывает эту функцию. Чтобы решить эту проблему, часто используйте me или self, чтобы убедиться, что они ссылаются на правильный объект... this, как и на фактический объект.

Ответ 2

Единственная причина, по которой вы обычно это делаете, это вызов вызова doQueue() внутри блока, который изменит значение this, например, другую функцию.

В этом случае, однако, это не служит никакой цели и, вероятно, является остатком старого кода, который не был изменен.

Ответ 3

Скорее всего разработчик хотел согласованности, , но не сделал этого.

В противном случае вы бы использовали this в некоторых функциях, self в других функциях и сочетание обоих в других функциях, в зависимости от того, где вы используете объект, и если вы используете вложенные функции/обратные вызовы.

От всегда присваивая this до self, а затем используя последнее, у вас есть одно дополнительное назначение в самом начале каждой функции, но вы всегда используете self для доступа к объекту.

Однако то, что разработчик сделал в коде, который вы разместили, не имеет большого смысла. Он должен либо использовать self, либо this оба раза вместо микса, что даже не нужно.

Ответ 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();
  } 
 };

Ответ 5

self - это копия 'this', но она всегда относится к правильному объекту, а 'this' может не быть.