关于这个和自我在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@ 到通常称为selfthatme 的局部变量,以便当this 在回调中具有不同值时,可以在回调函数内部使用该局部变量来引用主机对象功能。 谢谢@jfriend00。但恐怕我不是在问使用自变量的约定。我知道为什么。我在这样的非封闭代码中问为什么作者使用这两个词。我怀疑作者是否遵守任何约定以使代码更清晰,因为我多次看到这样的代码。 @AlvinCao - 当不需要self 时,在方法的一部分中使用this 而在方法的其他部分使用self 是不一致的并且通常是不好的做法。如果你打算使用self,那么在任何地方使用它,或者仅在闭包中需要时使用它,而不是有时而不是其他时候。这是不一致的,会使代码混乱,并使代码的读者想知道发生了什么(当没有任何事情发生时)。

以上是关于关于这个和自我在javascript中的主要内容,如果未能解决你的问题,请参考以下文章

关于如何使用模块模式的困惑

JavaScript:DOM 加载事件、执行顺序和 $(document).ready()

JavaScript:DOM 加载事件、执行顺序和 $(document).ready()

javasc面向对象编程

探索Javascript异步编程

一文道尽JavaScript 20年的发展史