我正在阅读mongoose
中的来源Collection.prototype.onOpen = function () {
var self = this;
this.buffer = false;
self.doQueue();
};
我不明白为什么作者会将this
分配给self
并运行self.doQueue()
。为什么不跑:
this.buffer = false;
this.doQueue();
我是javascript的新手,感谢您的帮助。
答案 0 :(得分:14)
你是对的,在这种情况下,他们可以简单地使用this
。
使用me
或self
有点确保使用this
的正确上下文,因为在JavaScript中,this
的范围是变体。例如,如果您的类中有一个事件触发一个函数,this
将会不同,并且不会是您的函数对象,而是调用该函数的对象。要解决此问题,通常会使用me
或self
来确保他们引用正确的对象... 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
来访问该对象。
但是,开发人员在您发布的代码中所做的事情没有多大意义。他应该使用self
或this
两次,而不是甚至不需要的混合。
答案 4 :(得分:-2)
self是'this'的副本,但它总是引用正确的对象,'this'可能不是。