关于这个和自我在javascript中
Posted
技术标签:
【中文标题】关于这个和自我在javascript中【英文标题】:About this and self in javascript 【发布时间】:2013-04-11 02:20:57 【问题描述】:我知道“自我”的魔法。但是看看这个来自nodejs的sn-p(不完整)。
Socket.prototype.connect = function(options, cb)
......
var self = this;
var pipe = !!options.path;
if (this.destroyed || !this._handle)
this._handle = pipe ? createPipe() : createTCP();
initSocketHandle(this);
if (typeof cb === 'function')
self.once('connect', cb);
timers.active(this);
self._connecting = true;
self.writable = true;
......
我的理解是我们必须使用 self 来创建一个闭包。这些行中没有闭包,但作者在将其分配给 self 后同时使用了这两个闭包。这里有什么不同吗?
【问题讨论】:
我认为使用它只是因为约定和与其余代码的统一性。在一个地方使用this
可能只是一种疏忽。
因为 self
设置为 this
它们是同一个变量。我不确定作者为什么将两者混为一谈。
【参考方案1】:
在您在此特定代码示例中显示的内容中,甚至没有理由使用 self
变量,因为没有其他函数范围可能需要访问 this
的原始值。
一些开发人员有一致的方法或约定来创建像 self
这样的局部变量,并为其分配 this
的值,以便他们在需要时在闭包中使用它。 self
变量也可以最小化为小于this
,因为它可以重命名为一个字符的变量名称,但不能重命名this
。
在任何情况下,如果 self
被删除并且在此特定方法中仅使用 this
,则此处的功能不会受到影响。
我自己的个人惯例是仅在实际需要时定义 self
,这与我用于其他局部变量的逻辑相同,然后我只在需要它的闭包内使用它。
【讨论】:
代码不完整。此函数中有闭包。我只是没有发布它。所以自我的创造是有意义的。 @AlvinCao - 如果在此方法中定义了匿名回调函数,并且这些回调函数想要访问this
的原始值,那么是的,这是分配 @ 值的常见设计模式987654332@ 到通常称为self
或that
或me
的局部变量,以便当this
在回调中具有不同值时,可以在回调函数内部使用该局部变量来引用主机对象功能。
谢谢@jfriend00。但恐怕我不是在问使用自变量的约定。我知道为什么。我在这样的非封闭代码中问为什么作者使用这两个词。我怀疑作者是否遵守任何约定以使代码更清晰,因为我多次看到这样的代码。
@AlvinCao - 当不需要self
时,在方法的一部分中使用this
而在方法的其他部分使用self
是不一致的并且通常是不好的做法。如果你打算使用self
,那么在任何地方使用它,或者仅在闭包中需要时使用它,而不是有时而不是其他时候。这是不一致的,会使代码混乱,并使代码的读者想知道发生了什么(当没有任何事情发生时)。以上是关于关于这个和自我在javascript中的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript:DOM 加载事件、执行顺序和 $(document).ready()