Зачем присваивать `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, спасибо за помощь.
Ответы
Ответ 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' может не быть.